如何从php中的两个2D数组中获取缺少的值

如何从php中的两个2D数组中获取缺少的值,php,laravel,Php,Laravel,我有两个数组 $a1 = Array ( [0] => Array ( [value] => 70, [unit] => kilogram(kg), [status] => active ), [1] => Array

我有两个数组

$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
        )
    );
我想得到的是两个数组之间的差异。i、 从数组中删除缺少的值

我使用了array_diff,但它返回一个错误:

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


任何人都有解决方案。

实现这一点的方法有很多,这里是其中之一,我假设您希望检查给定数组中的字段值

$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]);
    }
}
输出:

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));
}

请尝试以下代码:

<?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);
?>
希望这能对你有所帮助


来源:

如果没有array_diff函数调用,我们能提供什么帮助?这也是您创建$a2和$a1的实际方式吗?手动递增数组似乎很奇怪。是否要检查给定数组中的字段值?如果值元素相同怎么办?@Nick:虽然没有指定,但只有值是唯一的,但其他两个单位的状态可能属于多个。@Nick::这里数组值中缺少值表示字段值否,这意味着数组中有3个元素。@尼克:我不确定只有字段值,你也不确定所有3个元素。因此,让我们与OPIf一起检查,如果您要从其他地方复制代码,请将其属性化。这是PHP数组_diff.Done上作为注释发布的代码的精确副本。资料来源:
<?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);
?>