2015-03-03 105 views
-1

我有一个像下面的多数组,如果一个键(其他人)是一个数组需要合并。我尝试使用array_merge(call_user_func_array('array_merge',$ myArr))并且它没有按预期工作。php合并到相同的数组,如果键是数组

Array 
(
    [12] => Australia 
    [36] => Canada 
    [82] => Germany 
    [97] => Hong Kong 
    [100] => India 
    [154] => New Zealand 
    [190] => Singapore 
    [222] => United Arab Emirates 
    [223] => United Kingdom 
    [224] => United States of America 
    [Others] => Array 
     (
      [1] => Afghanistan 
      [3] => Algeria 
      [4] => Andorra 
      [6] => Anguilla 
     ) 
) 

我该如何转换为像下面一样丢失密钥。

Array 
(
    [12] => Australia 
    [36] => Canada 
    [82] => Germany 
    [97] => Hong Kong 
    [100] => India 
    [154] => New Zealand 
    [190] => Singapore 
    [222] => United Arab Emirates 
    [223] => United Kingdom 
    [224] => United States of America 
    [1] => Afghanistan 
    [3] => Algeria 
    [4] => Andorra 
    [6] => Anguilla 
) 

更新 我能做到这样,但我不知道这是做它的方式。

$temp = $myArr['others']; 
unset($myArr['others']); 
array_replace($myArr , $temp); 
+0

向我们展示你的最好的尝试,让我们看到正是你失败了。 – zerkms 2015-03-03 06:26:27

+0

它总是被称为“其他”吗?还是可以有其他内部数组? – 2015-03-03 06:47:16

+0

是的,它始终是相同的数组。 – 2015-03-03 06:48:08

回答

0

可以使用迭代器实现平坦化数组:

$myArr = iterator_to_array(new RecursiveIteratorIterator(
    new RecursiveArrayIterator($myArr) 
)); 
+0

哇,这太好了。非常感谢 – 2015-03-03 06:53:46

0

为什么不只是在做这样的事情:

if (array_key_exists('Others', $countries)) { 
    foreach ($countries['Others'] as $index => $otherCountry) { 
     if (array_key_exists($index, $countries)) { 
      // handle collisions 
     } else { 
      $countries[$index] = $otherCountry; 
     } 
    } 
} 

虽然这是不好的做法,这里是一个衬垫,可以压扁你的数组:

$allCountries = iterator_to_array(new RecursiveIteratorIterator(new RecursiveArrayIterator($countries))); 
+0

谢谢,但我正在寻找单行代码,请参阅上面的我的更新。 – 2015-03-03 06:43:31

+1

我可以问你为什么有这个要求吗?通常不建议隐藏复杂性 – Adrien 2015-03-03 06:44:41

+0

我编辑了我的答案以添加一个可用的单线程。还是不推荐:) – Adrien 2015-03-03 06:55:00

0

我已经做了自定义功能,可能会为你工作。它可以处理那里的嵌套数组。

<?php 
$test = array(
    12 => 'Australia', 
    36 => 'Canada', 
    82 => 'Germany', 
    97 => 'Hong Kong', 
    100 => 'India', 
    154 => 'New Zealand', 
    190 => 'Singapore', 
    222 => 'United Arab Emirates', 
    223 => 'United Kingdom', 
    224 => 'United States of America', 
    'Others' => array(
     1 => 'Afghanistan', 
     3 => 'Algeria', 
     4 => 'Andorra', 
     6 => 'Anguilla', 
     "test" => array(10 => 'Hello', 11 => 'World') 
    ) 
); 

$new = array(); 
my_merge($new, $test); 
var_dump($new); 

function my_merge(&$result, $source) 
{ 
    foreach ($source as $key => $value) { 
     if (is_array($value)) { 
      my_merge($result, $value); 
     } else { 
      $result[$key] = $value; 
     } 
    } 
} 
+0

真的很喜欢recusion的方法,谢谢 – 2015-03-03 06:55:07