有没有任何一种内置函数可以比较 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!';
}
if ( array_values( $a ) == array_values( $b ) {}
?? - Eric Holmes可以通过使用 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_diff
不能进行严格比较。更专门用于严格比较的是array_search
。因此,需要对值进行计数和索引,以便它们可以作为键进行比较(就像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
@Cleanshooter,很抱歉这并没有实现预期的功能:(在此情况下提到的array_diff也是如此)
$a1 = array('one','two');
$a2 = array('one','two','three');
var_dump(count(array_diff($a1, $a2)) === 0); // returns TRUE
(注解:在 PHP 5.5 之前,您不能在函数上使用 empty ) 在这种情况下,结果为真,尽管数组不同。
array_diff [...] 返回一个数组,其中包含 array1 中所有未出现在任何其他数组中的条目。
这并不意味着 array_diff
就像是 array_get_all_differences
。从数学集合的角度来解释,它计算的是:
{'one','two'} \ {'one','two','three'} = {}
var_dump(array_diff($a2, $a1));
计算为
array(1) { [2]=> string(5) "three" }
array_diff
,以获取两个数组中的所有“差异”。希望这能帮到你 :)if(serialize($a1) == serialize($a2))
只需检查$a1 == $a2
--这有什么问题吗?
以下是评论的结论:
仅比较数组值(进行类型转换后)是否相等且顺序相同:
array_values($a1) == array_values($a2)
比较数组值(在类型转换后)是否相等并且顺序相同,以及数组键是否相同且顺序相同:
array_values($a1) == array_values($a2) && array_keys($a1) == array_keys($a2)
sort($a1);
sort($a2);
echo (($a1==$a2) ? "arrays are equal" : "arrays are not equal");
一种快速比较任意顺序数组值的方法...
function arrays_are_same($array1, $array2) {
sort($array1);
sort($array2);
return $array1==$array2;
}
So for...
$array1 = array('audio', 'video', 'image');
$array2 = array('video', 'image', 'audio');
arrays_are_same($array1, $array2)
将返回 TRUE
var_dump(array(1,2,3) == array(3,2,1));
,则会得到 bool(false)
。同样的情况也适用于示例 #1:var_dump(standard_array_compare(array(1,2,3), array(3,2,1)));
返回 int(-1)
。 - chichilatte/**
@return array
*/
function createCache()
{
$cache = [];
foreach ($this->listOfUrl() as $url => $args)
{
ksort($args);
$cache['url'][$url] = $args;
$cache['arr'][crc32(serialize($args))] = $url;
}
return $cache;
}
/**
@param array $args
@return string
*/
function searchUrl($args)
{
ksort($params);
$crc = crc32(serialize($params));
return isset($this->cache['arr'][$crc]) ? $this->cache['arr'][$crc] : NULL;
}
/**
@param string $url
@return array
*/
function searchArgs($url)
{
return isset($this->cache['url'][$url]) ? $this->cache['url'][$url] : NULL;
}