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

Php 比较数组中多个值的最佳方法,php,Php,有没有一种更简洁的方法来比较两个数组的多个值而不是上面代码中的一个?以便比较多个值​​在具有给定键的两个数组(不是整个数组!)中,这样的函数非常有用: if ($item['id_piatto'] === $riga['id_piatto'] && $item['id_portata'] === $riga['id_portata'] && $item['id_dieta'] === $riga['id_dieta']) { $item['quantita

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

以便比较多个值​​在具有给定键的两个数组(不是整个数组!)中,这样的函数非常有用:

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];

“Equal”是这个测试数据的输出

正如上面的注释所指出的,您的原始解决方案很好,特别是当您只处理少量数组元素时。您只有3行代码,内存占用很小。除非你有充分的理由不这样做,否则就采用你自己的解决方案

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

$keys = ['id_piatto', 'id_portata', 'id_dieta'];

if(array_cmp_keys($item,$riga,$keys)) {
  echo "Equal";
}
else {
  echo "not Equal";
}

您可以使用PHP的高级数组解构语法,可从PHP7.1获得:

<?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'];
}
我认为这看起来很好,可读性也很好,但当输入数组具有不同的键和/或嵌套结构时,它确实非常出色,我将给您一个示例:

['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;
请注意,我是如何使用数字索引访问“bar”子数组中的第三个值的。最后,在其他一些答案中,这比自定义函数方法灵活得多。有关详细信息,请查看关于PHP中数组分解的博客文章

附录

如果这一切都是为了好看的代码和可读性,那么这真的比标准方法(可能用一些换行符构造)好吗

除了文体观点外,标准方法还有两大优势:

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

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

  • 另一方面,分解方法将动态生成输入数组的2个“规范化”子集,这在以后可能会很有用

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

    你现在做的有什么问题吗?我有一段代码与显示的代码非常相似,这篇文章引起了我的注意,因为OP不见了。你介意详细解释一下评论吗?正如你所说,没有什么问题,但我只是好奇,是否存在另一种更短、更好的方式来进行这种检查。我认为每个人都喜欢他们简单而美好的代码,很难不问问自己,如果每行代码太长,是否可以做得更干净@riggsfullyi如果这些数组必须完全相同,您可以使用其中一个答案,它工作得很好,但在这样的长条件下,您必须超过120个字符,这不是最佳的,也很难读取
    if(
            $one['foo'] === $two['foo']
        &&  $one['bar'][2] === $two['bar'][2]
        &&  $one['baz']['baz_id'] === $two['boo_id']
    ) {
        // Do something...      
    }
    
    if($a === $b) {
        // Do something
    } else {
        return [
            'error_msg' => "Inputs don't match",
            'context' => [
                'expected' => $a,
                'actual' => $b
            ]
        ];
    }