是否有一种简单的方法可以将一维数组转换为多维数组,并将新元素添加到新创建的子数组中?
国家/地区代码始终有2位数字,在一组位置之前只显示一次。这是我想复制的元素并将其添加到每个子数组中,如下所示。
提前致谢!
这就是我所拥有的:
0 => AT
1 => Vienna-S03-I01
2 => 28 Users
3 => Vienna-S03-I02
4 => 25 Users
5 => Vienna-S03-I03
6 => 24 Users
7 => AU
8 => Sydney-S01-I01
9 => 45 Users
10 => BE
11 => Brussels-S01-I01
12 => 30 Users
13 => Brussels-S01-I02
14 => 37 Users
这就是我想要的:
0 =>
0 => AT
1 => Vienna-S03-I01
2 => 28 Users
1 =>
0 => AT
1 => Vienna-S03-I02
2 => 25 Users
2 =>
0 => AT
1 => Vienna-S03-I03
2 => 24 Users
3 =>
0 => AU
1 => Sydney-S01-I01
2 => 45 Users
4 =>
0 => BE
1 => Brussels-S01-I01
2 => 30 Users
5 =>
0 => BE
1 => Brussels-S01-I02
2 => 37 Users
答案 0 :(得分:1)
如果确保数组始终遵循您演示的规则,则代码如下所示。否则,应该在那里添加很少的条件检查,以确保我们在每个给定的$ item中都有适当的值类型。
grid2d
答案 1 :(得分:0)
就函数调用和变量而言,这是一种非常简单的方法。 isset()
是一个非常快速的函数调用,所以在那里会有很小的阻力。通过在一行($result[++$i][]=$k=$v;
)中声明多个变量并通过在结果数组声明中递增计数器(++$i
)来压缩片段。
代码:(Demo)
$array = ['AT',
'Vienna-S03-I01',
'28 Users',
'Vienna-S03-I02',
'25 Users',
'Vienna-S03-I03',
'24 Users',
'AU',
'Sydney-S01-I01',
'45 Users',
'BE',
'Brussels-S01-I01',
'30 Users',
'Brussels-S01-I02',
'37 Users'];
$i=-1;
foreach($array as $v){
if(strlen($v)==2){ // check for new Country ID
$result[++$i][]=$k=$v; // preserve Country ID as $k, store as a new batch
}else{
if(isset($result[$i][2])){ // when three elements in current batch, start new...
$result[++$i][]=$k; // increment counter and store preserved Country ID
}
$result[$i][]=$v; // add $v to batch
}
}
var_export($result);
P.S。作为进一步微观优化的问题,您可以换出strlen()
进行另一次isset()
调用 - 但这有点不太直观:
$i=-1;
foreach($array as $v){
if(!isset($v[2])){ // check for existence of character at offset 2
$result[++$i][]=$k=$v;
}else{
if(isset($result[$i][2])){
$result[++$i][]=$k;
}
$result[$i][]=$v;
}
}
这是一种功能性方法,不需要为数组中的每个元素进行迭代。我只是喜欢array_splice()
以及它提取元素和缩短输入数组的奇妙双重动作:
// array_splice modifies the original array (shortens it) and returns the removed elements
while($array){
if(strlen($array[0])==2){ // if the first value is a Country id
$id=$array[0]; // preserve id
$result[]=array_splice($array,0,3); // cut away and preserve first three elements
}else{
$result[]=[$id]+array_splice($array,0,2); // store id and first two elements
}
}
var_export($result);
......最后,我的DRYest方法:
while($array){
if(strlen($array[0])==2){ // if the first value is a Country id
$id=array_splice($array,0,1);
}
$result[]=array_merge($id,array_splice($array,0,2)); // store preserved id and two elements
}
var_export($result);