PHP:具有元素乘法的一维数组到多维数组

时间:2017-08-10 00:24:11

标签: php arrays multidimensional-array

是否有一种简单的方法可以将一维数组转换为多维数组,并将新元素添加到新创建的子数组中?

国家/地区代码始终有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

2 个答案:

答案 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);