我如何找到具有一个公共键的两个关联数组之间的差异
How i can Find Difference between two Associative arrays having one common Key
我在 Magento 2.3 中工作,我有两个数组
第一个数组:
Array
(
[0] => Array
(
[name] => /l/u/luma-foam-roller.jpg
[image_id] => luma-foam-roller.jpg
)
[1] => Array
(
[name] => /l/u/luma-yoga-strap-set.jpg
[image_id] => luma-yoga-strap-set.jpg
)
[2] => Array
(
[name] => /m/b/mb04-black-0.jpg
[image_id] => mb04-black-0.jpg
)
[3] => Array
(
[name] => /l/u/luma-stability-ball-pink.jpg
[image_id] => luma-stability-ball-pink.jpg
)
[4] => Array
(
[name] => /m/b/mb01-blue-0.jpg
[image_id] => mb01-blue-0.jpg
)
}
第二个数组:
Array
(
[0] => Array
(
[name] => /m/b/mb01-blue-0.jpg
)
[1] => Array
(
[name] => /m/b/mb04-black-0.jpg
)
[2] => Array
(
[name] => /m/b/mb04-black-0_alt1.jpg
)
[3] => Array
(
[name] => /m/b/mb03-black-0.jpg
)
[4] => Array
(
[name] => /m/b/mb03-black-0_alt1.jpg
)
}
我想根据名字找出不同之处
我的预期结果是
Array
(
[0] => Array
(
[name] => /l/u/luma-foam-roller.jpg
[image_id] => luma-foam-roller.jpg
)
[1] => Array
(
[name] => /l/u/luma-yoga-strap-set.jpg
[image_id] => luma-yoga-strap-set.jpg
)
[3] => Array
(
[name] => /l/u/luma-stability-ball-pink.jpg
[image_id] => luma-stability-ball-pink.jpg
)
}
我尝试了以下功能,但没有一个对我有用
- array_diff()
- array_diff_assoc()
- array_unique(array_merge($array1,$array2), SORT_REGULAR);
但没有取得任何成功
目前我想不出有任何一个线性函数可以自动执行此操作,但一种直接的方法就是使用循环。
$names = array_column($second, 'name');
$diff = array();
foreach ($first as $k => $values) {
if (!in_array($values['name'], $names)) {
$diff[$k] = $values;
}
}
// print_r($diff);
基本上,您只需首先获取所有名称(通过 array_column
)并使 em 变平,以便您可以利用 in_array
进行搜索和比较。
那时候,只是一个不起眼的foreach
和if
。此示例创建差异的新副本。如果您不想创建另一个副本,您可以只 unset()
第一个数组并反转条件,只留下原始数组的差异。
array_udiff 可以帮助:
function compare_by_name($a, $b) {
$nameA = isset($a['name']) ? $a['name'] : '';
$nameB = isset($b['name']) ? $b['name'] : '';
return strcmp($nameA, $nameB);
}
print_r(array_udiff($arr1, $arr2, 'compare_by_name'));
我在 Magento 2.3 中工作,我有两个数组
第一个数组:
Array
(
[0] => Array
(
[name] => /l/u/luma-foam-roller.jpg
[image_id] => luma-foam-roller.jpg
)
[1] => Array
(
[name] => /l/u/luma-yoga-strap-set.jpg
[image_id] => luma-yoga-strap-set.jpg
)
[2] => Array
(
[name] => /m/b/mb04-black-0.jpg
[image_id] => mb04-black-0.jpg
)
[3] => Array
(
[name] => /l/u/luma-stability-ball-pink.jpg
[image_id] => luma-stability-ball-pink.jpg
)
[4] => Array
(
[name] => /m/b/mb01-blue-0.jpg
[image_id] => mb01-blue-0.jpg
)
}
第二个数组:
Array
(
[0] => Array
(
[name] => /m/b/mb01-blue-0.jpg
)
[1] => Array
(
[name] => /m/b/mb04-black-0.jpg
)
[2] => Array
(
[name] => /m/b/mb04-black-0_alt1.jpg
)
[3] => Array
(
[name] => /m/b/mb03-black-0.jpg
)
[4] => Array
(
[name] => /m/b/mb03-black-0_alt1.jpg
)
}
我想根据名字找出不同之处 我的预期结果是
Array
(
[0] => Array
(
[name] => /l/u/luma-foam-roller.jpg
[image_id] => luma-foam-roller.jpg
)
[1] => Array
(
[name] => /l/u/luma-yoga-strap-set.jpg
[image_id] => luma-yoga-strap-set.jpg
)
[3] => Array
(
[name] => /l/u/luma-stability-ball-pink.jpg
[image_id] => luma-stability-ball-pink.jpg
)
}
我尝试了以下功能,但没有一个对我有用
- array_diff()
- array_diff_assoc()
- array_unique(array_merge($array1,$array2), SORT_REGULAR);
但没有取得任何成功
目前我想不出有任何一个线性函数可以自动执行此操作,但一种直接的方法就是使用循环。
$names = array_column($second, 'name');
$diff = array();
foreach ($first as $k => $values) {
if (!in_array($values['name'], $names)) {
$diff[$k] = $values;
}
}
// print_r($diff);
基本上,您只需首先获取所有名称(通过 array_column
)并使 em 变平,以便您可以利用 in_array
进行搜索和比较。
那时候,只是一个不起眼的foreach
和if
。此示例创建差异的新副本。如果您不想创建另一个副本,您可以只 unset()
第一个数组并反转条件,只留下原始数组的差异。
array_udiff 可以帮助:
function compare_by_name($a, $b) {
$nameA = isset($a['name']) ? $a['name'] : '';
$nameB = isset($b['name']) ? $b['name'] : '';
return strcmp($nameA, $nameB);
}
print_r(array_udiff($arr1, $arr2, 'compare_by_name'));