2017-03-13 21 views
2
$php -a 
php > $data1 = ['tag' => 'div', 'classes' => [1,2,3]]; 
php > $data2 = ['tag' => 'section', 'classes' => [2,3,4,5,6]]; 
php > $result = array_merge_recursive($data1, $data2); 
php > print_r($result); 
Array 
(
    [tag] => Array 
     (
      [0] => div 
      [1] => section 
     ) 

    [classes] => Array 
     (
      [0] => 1 
      [1] => 2 
      [2] => 3 
      [3] => 2 
      [4] => 3 
      [5] => 4 
      [6] => 5 
      [7] => 6 
     ) 

) 

以便在Docs描述:PHP-array_merge_recursive()沒有陣相同的鍵

如果輸入陣列具有相同的字符串鍵,則對於這些鍵的值被合併在一起,成爲一個數組[...]

在PHP中是否有一個現有的函數基本上是相同的,但沒有將相同的鍵合併到數組中,以便重寫值並保存鍵?

在這種情況下,我想有一個結果:

Array 
(
    [tag] => section 

    [classes] => Array 
     (
      [0] => 1 
      [1] => 2 
      [2] => 3 
      [5] => 4 
      [6] => 5 
      [7] => 6 
     ) 

) 

在問候@JustOnUnderMillions的評論:

是的,我在想,是不是我期望這樣的功能的,我期待一個結果,因爲我正在尋找。

+0

如果值被覆蓋那麼你的結果將是'$ data2' –

+0

爲內'陣列classes'關鍵:如果* ([0] => 1 [1] => 2 [2] => 3 [5] => 4 [ ( [0] => 2 [1] => 3 [2] => 4 [3] => 5 01 => 5 [7] =>[4] => 6 )' – RomanPerekhrest

+0

您是否需要合併是遞歸的? –

回答

0

得到你需要使用這個結果:

function my_array_merge_recursive($array1,$array2){ 
    foreach($array1 as $key=>&$val){ 
     if(!isset($array2[$key])){ 
      contiune; 
     } 
     if(is_array($val)){ 
      $val = array_unique(array_merge($val,$array2[$key])); 
     } else { 
      $val=$array2[$key]; 
     } 
     unset($array2[$key]); 
    } 
    #if we have entries left in second array 
    if(count($array2)){ 
     return array_merge($array1,$array2); 
    } 
    return $array1; 
} 
$data1 = ['tag' => 'div', 'classes' => [1,2,3]]; 
$data2 = ['tag' => 'section', 'classes' => [2,3,4,5,6]]; 
$result = my_array_merge_recursive($data1, $data2); 
print_r($result); 

此功能僅針對這種特殊情況。

+0

這不是遞歸的,只能處理兩個數組作爲輸入。 – philipp

+0

@philipp Plz再次閱讀答案的最後一行,thnx。如果你問我:_我想得到那個結果_ - 你想以非常特殊的方式合併數組。在PHP中沒有功能會爲你做到這一點。建立你自己的,也許使用這個版本的一個起點。 – JustOnUnderMillions

0

可以處理這個功能(遞歸和多陣列):

<?php 

$data1 = ['tag' => 'div', 'classes' => [1,2,3], 'foo' => ['bar' => [1,2], 'bar2' => 'foo']]; 
$data2 = ['tag' => 'section', 'classes' => [2,3,4,5,6], 'foo' => ['bar' => [2,3], 'bar3' => 'foo']]; 
$data3 = ['tag' => 'section', 'classes' => [7], 'foo' => ['bar' => [5], 'bar3' => 'foo2']]; 


print_r(custom_array_merge($data1, $data2, $data3)); 

function custom_array_merge() { 
    $arguments = func_get_args(); 
    $datas = call_user_func_array('array_merge', $arguments); 
    foreach($datas as $key => $value) { 
     if(is_array($value)) { 
      $values = []; 
      foreach($arguments as $array) { 
       $values[] = isset($array[$key]) ? $array[$key] : []; 
      } 

      if(array_depth($value) === 1) { 
       $datas[$key] = array_unique(call_user_func_array('array_merge', $values)); 
      }else { 
       $datas[$key] = call_user_func_array('custom_array_merge', $values); 
      } 
     } 
    } 

    return $datas; 
} 

function array_depth(array $array) { 
    $max_depth = 1; 

    foreach ($array as $value) { 
     if (is_array($value)) { 
      $depth = array_depth($value) + 1; 

      if ($depth > $max_depth) { 
       $max_depth = $depth; 
      } 
     } 
    } 

    return $max_depth; 
} 
+0

爲什麼使用'call_user_function'而不是直接調用函數:'custom_array_merge(...)'? – philipp

+0

因爲你想處理多個陣列作爲輸入 –

+0

啊,我明白了...'call_user_func_array',藉口......如Javascript Function.prototype.apply的'()' – philipp