如何从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);
?>