php获取数组中的“新”值

时间:2010-03-12 22:29:29

标签: php arrays

今天尝试了解php的数组。

我有一组像这样的数组:

$a = array ( 
    0 => array ( 'value' => 'America', ), 
    1 => array ( 'value' => 'England', ),  
    2 => array ( 'value' => 'Australia', ), 
)
$b = array ( 
    0 => array ( 'value' => 'America', ), 
    1 => array ( 'value' => 'England', ), 
    2 => array ( 'value' => 'Canada', ), 
)

我需要获得数组b带来的'新'子数组。

即,我需要返回array ( 'value' => 'Canada', )

我以为我可以先合并$ a + $ b,然后将结果与$ a进行比较。

$merge = array_merge($a,$b);
$result = array_diff($merge,$a);

但不知怎的,这不起作用。它返回array()

为什么?谢谢!

5 个答案:

答案 0 :(得分:2)

这应该可以解决问题:

$new = array();
foreach($b as $elem){
    if(!in_array($elem, $a)){
        $new[] = $elem;
    }
}

返回加拿大。

答案 1 :(得分:0)

如果我将代码运行到array_merge($a, $b)并执行var_dump($merge),我就明白了:

array(6) {
  [0]=>
  array(1) {
    ["value"]=>
    string(7) "America"
  }
  [1]=>
  array(1) {
    ["value"]=>
    string(7) "England"
  }
  [2]=>
  array(1) {
    ["value"]=>
    string(9) "Australia"
  }
  [3]=>
  array(1) {
    ["value"]=>
    string(7) "America"
  }
  [4]=>
  array(1) {
    ["value"]=>
    string(7) "England"
  }
  [5]=>
  array(1) {
    ["value"]=>
    string(6) "Canada"
  }
}

那不是,你有什么想法。

-

此外,php.net上的array_diff's文档读取:

Note: Two elements are considered equal if and only if (string) $elem1 === (string) $elem2. In words: when the string representation is the same.
Note: This function only checks one dimension of a n-dimensional array. Of course you can check deeper dimensions by using array_diff($array1[0], $array2[0]);. 

答案 2 :(得分:0)

我对你的要求不是百分百肯定的。如果你想在一个你可以使用的函数中返回数组$ b的加拿大部分 return $b[2]。 这将返回一个包含value => Canada的数组。如果要显示数组的内容,可以像这样使用var_dump函数。

var_dump($VaribleToDisplay);

var_dump也可以用于其他变量类型。

答案 3 :(得分:0)

由于您的数组包含由公用键索引的子数组,因此您不能使用array_merge,array_diff等,因为它们处理由键索引的数组(无子数组)。

您可以使用array_walk执行您想要的操作,但需要更多代码。考虑类似的事情:

$newVals = array();

function walker($sub, $key, $otherArray)
{
    $found = false;
    foreach($otherArray as $idx => $sub2)
    {  
        if ($sub['value'] == $sub2['value'])
        {
            $found = true;
            break;
        }
    }
    if (!$found)
        $newVals[] = $sub;
}

array_walk($a, 'walker', $b);

这不是特别快。如果您可以将输入数据更改为直接在数组中使用key =>值(而不是子数组),那么array_diff和array_merge将起作用并且速度会快得多。

即。你真的想重组这样的数据:

 $a = array( 'America', 'Australia', 'Canada' );

或类似的东西。

答案 4 :(得分:0)

为什么你要设置你的数组就像选择什么?

$a = array('countries'=> array('America', 'England', 'Australia'));
$b = array('countries'=> array('America', 'England', 'Canada'));
array_diff($b['countries'], $a['countries']);