2015-03-03 139 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