【发布时间】:2011-11-15 09:26:45
【问题描述】:
如何比较 php 中的多维数组?有没有简单的方法?
【问题讨论】:
标签: php arrays multidimensional-array compare
如何比较 php 中的多维数组?有没有简单的方法?
【问题讨论】:
标签: php arrays multidimensional-array compare
我知道的最简单的方法:
$a == $b;
请注意,您也可以使用===。它们之间的区别是:
对于双等号 ==,顺序很重要:
$a = array(0 => 'a', 1 => 'b');
$b = array(1 => 'b', 0 => 'a');
var_dump($a == $b); // true
var_dump($a === $b); // false
使用 三等号 ===,类型很重要:
$a = array(0, 1);
$b = array('0', '1');
var_dump($a == $b); // true
var_dump($a === $b); // false
【讨论】:
array(0, 1) != array(1, 0),所以它取决于键/索引。
array(0, 1) == array(1, 0) 是真的,那就没有多大意义了,不是吗?
要比较数组的结构,你应该使用恒等运算符。
if($arrayA === $arrayB) {
...
}
【讨论】:
== 作为数组中的元素,而是使用===,并使用=== 检查顺序键值对。根据我从问题中了解到的情况,OP 想要 ==,NOT ===。如果 OP 对此感兴趣,我还会在我的答案上添加一个链接。
$a = array(1 => 'a', 0 => 'b'); $b = array(0 => 'b', 1 => 'a');,OP 想要一些会返回 false 的东西?很有趣。
a = array(1 => 'a', 0 => array(1 => 'b')); 和 $b = array(1 => "banana", "0" => array(0 => 'apple')); ?
function multi_diff($arr1,$arr2){
$result = array();
foreach ($arr1 as $k=>$v){
if(!isset($arr2[$k])){
$result[$k] = $v;
} else {
if(is_array($v) && is_array($arr2[$k])){
$diff = multi_diff($v, $arr2[$k]);
if(!empty($diff))
$result[$k] = $diff;
}
}
}
return $result;
}
//example:
var_dump(multi_diff(
array(
"A"=>array(
"A1"=>array('A1-0','A1-1','A1-2','A1-3'),
"A2"=>array('A2-0','A2-1','A2-2','A2-3'),
"A3"=>array('A3-0','A3-1','A3-2','A3-3')
),
"B"=>array(
"B1"=>array('B1-0','B1-1','B1-2','B1-3'),
"B2"=>array('B2-0','B2-1','B2-2','B2-3'),
"B3"=>array('B3-0','B3-1','B3-2','B3-3')
),
"C"=>array(
"C1"=>array('C1-0','C1-1','C1-2','C1-3'),
"C2"=>array('C2-0','C2-1','C2-2','C2-3'),
"C3"=>array('C3-0','C3-1','C3-2','C3-3')
),
"D"=>array(
"D1"=>array('D1-0','D1-1','D1-2','D1-3'),
"D2"=>array('D2-0','D2-1','D2-2','D2-3'),
"D3"=>array('D3-0','D3-1','D3-2','D3-3')
)
),
array(
"A"=>array(
"A1"=>array('A1-0','A1-1','A1-2','A1-3'),
"A2"=>array('A2-0','A2-1','A2-2','A2-3'),
"A3"=>array('A3-0','A3-1','A3-2')
),
"B"=>array(
"B1"=>array('B1-0','B1-2','B1-3'),
"B2"=>array('B2-0','B2-1','B2-2','B2-3'),
"B3"=>array('B3-0','B3-1','B3-3')
),
"C"=>array(
"C1"=>array('C1-0','C1-1','C1-2','C1-3'),
"C3"=>array('C3-0','C3-1')
),
"D"=>array(
"D1"=>array('D1-0','D1-1','D1-2','D1-3'),
"D2"=>array('D2-0','D2-1','D2-2','D2-3'),
"D3"=>array('D3-0','D3-1','D3-2','D3-3')
)
)
));
【讨论】:
另一种方法是serialize() 两个数组并比较字符串。
【讨论】:
serialize(['a'=>'foo', 'b'=>'bar']) != serialize(['b'=>'bar', 'a'=>'foo'])
$difference = array();
foreach($array1 as $key => $value)
{
if(is_array($value))
{
if(!isset($array2[$key]))
{
$difference[$key] = $value;
}
elseif(!is_array($array2[$key]))
{
$difference[$key] = $value;
}
else
{
$new_diff = array_diff($value, $array2[$key]);
if($new_diff != FALSE)
{
$difference[$key] = $new_diff;
}
}
}
elseif(!isset($array2[$key]) || $array2[$key] != $value)
{
$difference[$key] = $value;
}
}
【讨论】:
此功能将为您完成所有工作。
您可以使用它来真正比较任何2个相同或完全不同结构的数组。
它会返回:
array1 中的值不在 array2 (更多)
array2 中的值不在 array1 (less)
array1 和 array2 中的值,但 不同 (diff)
//results for array1 (when it is in more, it is in array1 and not in array2. same for less)
function compare_multi_Arrays($array1, $array2){
$result = array("more"=>array(),"less"=>array(),"diff"=>array());
foreach($array1 as $k => $v) {
if(is_array($v) && isset($array2[$k]) && is_array($array2[$k])){
$sub_result = compare_multi_Arrays($v, $array2[$k]);
//merge results
foreach(array_keys($sub_result) as $key){
if(!empty($sub_result[$key])){
$result[$key] = array_merge_recursive($result[$key],array($k => $sub_result[$key]));
}
}
}else{
if(isset($array2[$k])){
if($v !== $array2[$k]){
$result["diff"][$k] = array("from"=>$v,"to"=>$array2[$k]);
}
}else{
$result["more"][$k] = $v;
}
}
}
foreach($array2 as $k => $v) {
if(!isset($array1[$k])){
$result["less"][$k] = $v;
}
}
return $result;
}
【讨论】:
array_key_exists($k, $array2[$k]) 而不是测试isset($array2[$k]) 因为isset 测试密钥存在并且具有非空值。
array_key_exists($k, $array2)