2017-08-10 147 views
0

是否有一种简单的方法将一维数组转换为多维数组,并且向新创建的子数组中添加某个元素?PHP:一维数组到多维数组与元素的乘法

countrycode始终有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

请问名单总是以国家代码? –

回答

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); 
+0

感谢mickmackusa - 您的所有方法都能正常工作。 – khofm

+0

@khofm ...但不接受?奇怪。我提供了两个精炼/优化和解释的方法,但没有爱。 – mickmackusa

+0

我想我以为我可以接受多个答案,但这似乎并不正确。我该如何决定哪个工作可以接受? :-) – khofm

1

如果有保证阵列将始终遵循规则,你证明了,则代码如下。否则,应该在那里添加很少的条件检查,以确保我们在每个给定的$ item中都有适当的值类型。

$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']; 

$code='none'; 
$result=[]; 
$resIndex=-1; 
$swing=false; 
foreach($array as $item){ 
    if (strlen($item)===2){ 
     $code=$item; 
    }else{ 
     if ($swing===false){ 
      $resIndex++; 
      $result[$resIndex][]=$code; 
     } 
     $result[$resIndex][]=$item; 
     $swing=!$swing; 
    } 
} 

print_r($result); 
?> 
+0

感谢iXCray-您的所有方法都能正常工作。 – khofm