PHP 比较数组
2022-08-30 14:23:25
有没有使用内置函数来比较php中的数组,而不是做某种循环?
$a1 = array(1,2,3);
$a2 = array(1,2,3);
if (array_are_same($a1, $a2)) {
// code here
}
顺便说一句,数组值并不总是以相同的顺序排列。
有没有使用内置函数来比较php中的数组,而不是做某种循环?
$a1 = array(1,2,3);
$a2 = array(1,2,3);
if (array_are_same($a1, $a2)) {
// code here
}
顺便说一句,数组值并不总是以相同的顺序排列。
if ( $a == $b ) {
echo 'We are the same!';
}
比较两个数组是否具有相等的值(重复或不重复,考虑类型杂耍)可以通过在两个方向上使用array_diff()
来完成:
!array_diff($a, $b) && !array_diff($b, $a);
这给出了两个数组是否具有相同的值(在类型杂耍之后)。 否则。例子:TRUE
FALSE
function array_equal_values(array $a, array $b) {
return !array_diff($a, $b) && !array_diff($b, $a);
}
array_equal_values([1], []); # FALSE
array_equal_values([], [1]); # FALSE
array_equal_values(['1'], [1]); # TRUE
array_equal_values(['1'], [1, 1, '1']); # TRUE
如此示例所示,将数组键排除在等式之外,也不关心值的顺序,也不关心值是否重复。array_diff
如果重复必须有所作为,那就变得更加棘手。就“简单”值而言(只有字符串和整数值有效),array_count_values()
发挥作用以收集有关数组中哪个值的频率的信息。此信息可以很容易地与以下信息进行比较:==
array_count_values($a) == array_count_values($b);
这给出了两个数组是否在相同的时间内具有相同的值(在类型杂耍之后)。 否则。例子:TRUE
FALSE
function array_equal_values(array $a, array $b) {
return array_count_values($a) == array_count_values($b);
}
array_equal_values([2, 1], [1, 2]); # TRUE
array_equal_values([2, 1, 2], [1, 2, 2]); # TRUE
array_equal_values(['2', '2'], [2, '2.0']); # FALSE
array_equal_values(['2.0', '2'], [2, '2.0']); # TRUE
这可以进一步优化,方法是首先比较两个数组的计数,这是相对便宜的,并且在计算重复值时区分大多数数组的快速测试会有所不同。
到目前为止,这些示例部分限于字符串和整数值,并且无法与任何一个进行严格的比较。更专门用于严格比较的是array_search
。因此,需要对值进行计数和索引,以便可以对它们进行比较,因为只是将它们转换为键(就像这样)不会成功。array_diff
array_search
这是更多的工作。但是,最终比较与之前相同:
$count($a) == $count($b);
只是这才是有区别的:$count
$table = [];
$count = function (array $array) use (&$table) {
$exit = (bool)$table;
$result = [];
foreach ($array as $value) {
$key = array_search($value, $table, true);
if (FALSE !== $key) {
if (!isset($result[$key])) {
$result[$key] = 1;
} else {
$result[$key]++;
}
continue;
}
if ($exit) {
break;
}
$key = count($table);
$table[$key] = $value;
$result[$key] = 1;
}
return $result;
};
这将保留一个值表,以便两个数组可以使用相同的索引。此外,还可以在第二个数组中第一次遇到新值时提前退出。
此函数还可以通过具有附加参数来添加严格上下文。通过添加另一个附加参数,可以允许查找重复项。完整示例:
function array_equal_values(array $a, array $b, $strict = FALSE, $allow_duplicate_values = TRUE) {
$add = (int)!$allow_duplicate_values;
if ($add and count($a) !== count($b)) {
return FALSE;
}
$table = [];
$count = function (array $array) use (&$table, $add, $strict) {
$exit = (bool)$table;
$result = [];
foreach ($array as $value) {
$key = array_search($value, $table, $strict);
if (FALSE !== $key) {
if (!isset($result[$key])) {
$result[$key] = 1;
} else {
$result[$key] += $add;
}
continue;
}
if ($exit) {
break;
}
$key = count($table);
$table[$key] = $value;
$result[$key] = 1;
}
return $result;
};
return $count($a) == $count($b);
}
使用示例:
array_equal_values(['2.0', '2', 2], ['2', '2.0', 2], TRUE); # TRUE
array_equal_values(['2.0', '2', 2, 2], ['2', '2.0', 2], TRUE); # TRUE
array_equal_values(['2.0', '2', 2, 2], ['2', '2.0', 2], TRUE, FALSE); # FALSE
array_equal_values(['2'], ['2'], TRUE, FALSE); # TRUE
array_equal_values([2], ['2', 2]); # TRUE
array_equal_values([2], ['2', 2], FALSE); # TRUE
array_equal_values([2], ['2', 2], FALSE, TRUE); # FALSE