比较数组中多个值的最佳方式


if ($item['id_piatto'] === $riga['id_piatto'] && $item['id_portata'] === $riga['id_portata'] && $item['id_dieta'] === $riga['id_dieta']) {
$item['quantita'] += $riga['quantita'];
} 

有没有一种更紧凑的方法来比较两个数组的多个值,而不是上面代码中的一个?

为了比较几个值​​对于给定密钥的两个数组(不是整个数组!(,这样的函数很有用:

function array_cmp_keys(array $arr1, array $arr2, array $keys){
foreach($keys as $key){
if($arr1[$key] !== $arr2[$key]) return false;
}
return true;
}

测试数据:

$item = ['id_piatto' => 1, 'id_portata' => 2, 'id_dieta' => 3, 'xx' => 4];
$riga = ['id_piatto' => 1, 'id_portata' => 2, 'id_dieta' => 3, 'xx' => 5];

如何使用:

$keys = ['id_piatto', 'id_portata', 'id_dieta'];
if(array_cmp_keys($item,$riga,$keys)) {
echo "Equal";
}
else {
echo "not Equal";
}

"等于";是该测试数据的输出

正如顶部注释所指出的,您的原始解决方案很好,尤其是当您只处理少量数组元素时。您只有3行代码,而且内存占用空间很小。使用您自己的解决方案,除非您有充分的理由不这样做。

如果要比较大量的数组元素,而要排除的元素数量有限,那么您可能希望稍微自动化一些。请注意,这会影响内存,因为您正在复制数组。

<?php
// Original arrays
$first = ['name' => 'tony', 'address' => '123 Main St.', 'position' => 'clerk', 'amount' => 15];
$second = ['name' => 'tony', 'address' => '123 Main St.', 'position' => 'clerk', 'amount' => 23];
// Keys that you want to exclude from the comparison. 
$excludeInComparison = ['amount'];
// Duplicate the arrays but exclude these keys for the comparison.
$firstFiltered = array_diff_key($first, array_flip($excludeInComparison));
$secondFiltered = array_diff_key($second, array_flip($excludeInComparison));
// Compare the filtered arrays
if ($firstFiltered == $secondFiltered) {
$first['amount'] += $second['amount'];
}

您可以使用PHP的高级数组析构函数语法,可从PHP 7.1:获得

['id_piatto' => $a[], 'id_portata' => $a[], 'id_dieta' => $a[]] = $item;
['id_piatto' => $b[], 'id_portata' => $b[], 'id_dieta' => $b[]] = $riga;
$item['quantita'] += ($a === $b) ? $riga['quantita'] : 0;

我认为这看起来很好,可读性很强,但当输入数组有不同的键和/或嵌套结构时,它真的很出色,我给你举个例子:

$one = [
'foo' => 1,
'bar' => [1,2,3],
'baz' => ['baz_id' => 4]
];
$two = [
'foo' => 1,
'bar' => [5,5,3],
'boo_id' => 4
];
['foo' => $a[], 'bar' => [2 => $a[]], 'baz' => ['baz_id' => $a[]]] = $one;
['foo' => $b[], 'bar' => [2 => $b[]], 'boo_id' => $b[]] = $two;
var_dump($a === $b); // true

请注意我是如何使用数字索引访问"bar"子数组中的第三个值的。最后,这比其他一些答案中的自定义函数方法要灵活得多。有关详细信息,请查看这篇关于PHP中数组析构函数的博客文章。

附录

如果这一切都是关于好看的代码和可读性,那么这真的比标准方法(可能是用换行符构建的(更好吗?

if(
$one['foo'] === $two['foo']
&&  $one['bar'][2] === $two['bar'][2]
&&  $one['baz']['baz_id'] === $two['boo_id']
) {
// Do something...      
}

除了风格观点之外,标准方法还有两大优势:

  1. 可以很容易地为每个表达式使用单独的比较运算符

  2. 可以实现更高级的布尔逻辑

另一方面,破坏方法将产生2";归一化的";输入数组的子集,这可能在以后有用。。。

if($a === $b) {
// Do something
} else {
return [
'error_msg' => "Inputs don't match",
'context' => [
'expected' => $a,
'actual' => $b
]
];
}

最新更新