2011-01-30 75 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]