我应该如何从PHP中的两个2​​D数组中获取缺失值

时间:2019-12-28 06:35:18

标签: php laravel

我有两个数组

$a1 = Array
            (
            [0] => Array
                (
                [value] => 70,
                [unit] => kilogram(kg),
                [status] => active
            ),
            [1] => Array
                (
                [value] => 80,
                [unit] => kilogram(kg),
                [status] => inactive
            ),
            [2] => Array
                (
                [value] => 67,
                [unit] => gram(g),
                [status] => active
            ),
            [3] => Array
                (
                [value] => 54,
                [unit] => gram(g),
                [status] => inactive
            )
        );

第二个数组是:

$a2 = Array
        (
        [0] => Array
            (
            [value] => 70,
            [unit] => kilogram(kg),
            [status] => active
        ),
        [1] => Array
            (
            [value] => 80,
            [unit] => kilogram(kg),
            [status] => inactive
        ),
        [2] => Array
            (
            [value] => 67,
            [unit] => gram(g),
            [status] => active
        ),
        [3] => Array
            (
            [value] => 54,
            [unit] => gram(g),
            [status] => inactive
        ),
        [4] => Array
            (
            [value] => 50,
            [unit] => kilogram(kg),
            [status] => active
        )
    );

我想要得到两个数组之间的差异。即缺少数组中的值。

我使用了array_diff,但是返回的错误是:

  

array_diff行上的数组到字符串的转换

任何人都有解决方案。

3 个答案:

答案 0 :(得分:2)

请尝试以下代码:

<?php
function arrayRecursiveDiff($aArray1, $aArray2) {
  $aReturn = array();

  foreach($aArray1 as $mKey => $mValue) {
    if(array_key_exists($mKey, $aArray2)) {
      if(is_array($mValue)) {
        $aRecursiveDiff = arrayRecursiveDiff($mValue, $aArray2[$mKey]);
        if(count($aRecursiveDiff)) {
          $aReturn[$mKey] = $aRecursiveDiff;
        }
      }
      else {
        if($mValue != $aArray2[$mKey]) {
          $aReturn[$mKey] = $mValue;
        }
      }
    }
    else {
      $aReturn[$mKey] = $mValue;
    }
  }

  return $aReturn;
}

$a1 = [
        ["value" => 70, "unit" => "kilogram(kg)", "status" => "active"],
        ["value" => 80, "unit" => "kilogram(kg)", "status" => "inactive"],
        ["value" => 67, "unit" => "gram(g)", "status" => "active"],
        ["value" => 54, "unit" => "gram(g)", "status" => "inactive"]
      ];

$a2 = [
        ["value" => 70, "unit" => "kilogram(kg)", "status" => "active"],
        ["value" => 80, "unit" => "kilogram(kg)", "status" => "inactive"],
        ["value" => 67, "unit" => "gram(g)", "status" => "active"],
        ["value" => 54, "unit" => "gram(g)", "status" => "inactive"],
        ["value" => 50, "unit" => "kilogram(kg)", "status" => "active"]
      ];

$arrdiff = arrayRecursiveDiff($a2, $a1);

echo "<pre>";
print_r($arrdiff);
?>

希望这对您有所帮助。

来源:https://www.php.net/manual/en/function.array-diff

答案 1 :(得分:1)

function key_compare_func($key1, $key2)
{
    if ($key1 == $key2)
        return 0;
    else if ($key1 > $key2)
        return 1;
    else
        return -1;
}
$aDiff = array_diff_ukey($a1, $a2, 'key_compare_func');

https://www.php.net/manual/en/function.array-diff-ukey.php

答案 2 :(得分:0)

有多种方法可以实现,这是其中一种,我假设您要检查给定数组中的字段value

$arr1 = [["value" => 70,"unit" => "kilogram(kg)","status" => "active"],["value" => 71,"unit" => "kilogram(kg)","status" => "active"],["value" => 72,"unit" => "kilogram(kg)","status" => "active"]];
$arr2 = [["value" => 70,"unit" => "kilogram(kg)","status" => "active"],["value" => 72,"unit" => "kilogram(kg)","status" => "active"],["value" => 73,"unit" => "kilogram(kg)","status" => "active"]];
$arr1Values = array_column($arr1,'value');
$arr2Values = array_column($arr2,'value');
$diff1 = array_diff($arr1Values,$arr2Values);
if(count($diff1)){
    echo "Extra in Arr 1\n";
    foreach($diff1 as $key=>$val){
        print_r($arr1[$key]);
    }
}
$diff2 = array_diff($arr2Values,$arr1Values);
if(count($diff2)){
    echo "Extra in Arr 2\n";
    foreach($diff2 as $key=>$val){
        print_r($arr2[$key]);
    }
}

Live Demo

输出:

Extra in Arr 2
Array
(
    [value] => 73
    [unit] => kilogram(kg)
    [status] => active
)

如果要将所有3个元素都保留为唯一,则可以使用以下代码

function func1($d){
    return implode(",",$d);//You can put any symbol here
};
$arr1Values = array_map('func1',$arr1);
$arr2Values = array_map('func1',$arr2);

$arr2ValuesDiff = array_diff($arr2Values,$arr1Values);
foreach($arr2ValuesDiff as $k=>$v){
    print_r(explode(',',$v));
}

Live Demo