2011-01-30 83 views
0

如何將這兩個數組合並...如何合併這兩個數組?

$arr1 = array(
    [0] => 'boofoo', 
    [1] => '2' 
); 

$arr2 = array(
    [0] => 'fbfb', 
    [1] => '6' 
); 

獲得第三陣列如下?:

$arr3 = array(
    [0] => 'boofoo', 
    [1] => '6' 
); 

也就是說,保留那些長的字符串和較高的數值。

回答

1

我認爲你可以通過http://www.php.net/manual/en/function.array-walk.php來實現。

我盡力爲它寫一些測試並更新文章。

P.S:array_map是更好的(也許走這甚至不是很好?)

<?php 

function combine($arr1, $arr2) { 
    return array_map("callback", $arr1, $arr2); 
} 

function callback($item, &$item2) { 
    if (is_numeric($item)) { 
     return max($item, $item2); 
    } 
    if (strlen($item2) > strlen($item)) { 
     return $item2; 
    } 
    return $item; 
} 

class Tests extends PHPUnit_Framework_TestCase { 
    public function testMergingArrays() { 
     $arr1 = array(
      'boofoo', 
      '2' 
     ); 

     $arr2 = array(
      'fbfb', 
      '6' 
     ); 

     $arr3 = array(
      'boofoo', 
      '6' 
     ); 

     $this->assertEquals($arr3, combine($arr1, $arr2)); 
    } 
} 

我在地方得到了測試,我現在可以重構它。但是這個實現確實有效。

4

如果兩個數組有相同的鍵,你可以做一個簡單的foreach,並根據他們的關係分別就>strlen挑選更好的價值:

$arr3 = array(); 
foreach ($arr1 as $key => $val) { 
    if (array_key_exists($key, $arr2)) { 
     if (is_numeric($val)) { 
      $arr3[$key] = max($val, $arr2[$key]); 
     } else { 
      $arr3[$key] = strlen($val) > strlen($arr2[$key]) ? $val : $arr2[$key]; 
     } 
    } 
} 

你問之前:expr1 ? expr2 : expr3 is the conditional operator,其中表達expr2expr3是基於expr1返回值進行評估。因此,如果strlen($val) > strlen($arr2[$key])爲真,則條件操作評估$val$arr2[$key]