在PHP中使用这两个数组:
$array1 = [
2 => 'Search',
1 => 'Front-End / GUI'
];
$array2 = [
1 => 'Front-End / GUI',
2 => 'Search'
];
大多数数组比较函数不关心顺序。执行array_diff
将导致一个空数组。
就订单和而言,比较两个阵列的最有效/最短/最干净的方法是什么
- 显示它们是否相等(真/假)
- 显示差异(例如PHPUnit)
理想情况下,在PHPUnit中运行$this->assertEquals( $array1, $array2 );
应该会产生以下结果:
Failed asserting that two arrays are equal.
--- Expected
+++ Actual
@@ @@
Array (
- 2 => 'Search'
- 1 => 'Front-End / GUI'
+ 1 => 'Front-End / GUI'
+ 2 => 'Search'
)
更新-解决方案
只有当所有元素都相同,只是顺序不同时,才会生成一种diff。PHPUnit测试:
public function test...() {
$actual = someCall();
$expected = [...];
// tests for same elements
$this->assertEquals( $expected, $actual );
// tests for same order
$diff = $this->array_diff_order( $expected, $actual );
$this->assertTrue( $expected === $actual, "Failed asserting that two arrays are equal order.'n--- Expected'n+++ Actual'n@@ @@'n Array('n$diff )" );
}
private function array_diff_order( $array1, $array2 ) {
$out = '';
while ((list($key1, $val1) = each($array1)) && (list($key2, $val2) = each($array2)) ) {
if($key1 != $key2 || $val1 != $val2) $out .= "- $key1 => '$val1' 'n+ $key2 => '$val2''n";
}
return $out;
}
您只需使用===
运算符
$array = array(1 => "test", 2=> "testing");
$array2 = array(1 => "test", 2=> "testing");
var_dump($array === $array2);
$array2 = array(2 => "test", 1=> "testing");
var_dump($array === $array2);
返回
boolean true
boolean false
然后使用array_diff_assoc()查找差异
while ((list($key1, $val1) = each($array)) && (list($key2, $val2) = each($array2)) ) {
if($key1 != $key2 || $val1 != $val2) echo "- $key1 - $val1 'n + $key2 - $val2";
}
应该为订单提供一些输出
使用你的阵列,这给了我
- 2-搜索+1-前端/GUI
- 1-前端/GUI+2-搜索
您可以根据需要更改输出
如果你正在寻找一个生成类似diff输出的解决方案,我认为这是迭代器大放异彩的地方:
只需为每个数组设置两个迭代器,并在一个循环中同时遍历它们并比较键+值对,就可以完成几乎所有需要的操作:
$array1 = [
2 => 'Search',
1 => 'Front-End / GUI'
];
$array2 = [
1 => 'Front-End / GUI',
2 => 'Search'
];
$it0 = new ArrayIterator($array1);
$it1 = new ArrayIterator($array2);
while ($it0->valid() || $it1->valid()) {
if ($it0->valid() && $it1->valid()) {
if ($it0->key() != $it1->key() || $it0->current() != $it1->current()) {
print "- ".$it0->key().' => '.$it0->current()."'n";
print "+ ".$it1->key().' => '.$it1->current()."'n";
}
$it0->next();
$it1->next();
} elseif ($it0->valid()) {
print "- ".$it0->key().' => '.$it0->current()."'n";
$it0->next();
} elseif ($it1->valid()) {
print "+ ".$it1->key().' => '.$it1->current()."'n";
$it1->next();
}
}
将输出类似以下内容:
- 2 => Search
+ 1 => Front-End / GUI
- 1 => Front-End / GUI
+ 2 => Search
当然,这个想法应该扩展到使用RecursiveArrayIterator
处理嵌套数组,并且可能还可以更好地格式化输出。
您需要array_diff_assoc(),它比较值和键。array_diff()只考虑值。
后续:在这里工作良好:
php > $arr1 = array(2 => 'Search', 1 => 'Front');
php > $arr2 = array(1 => 'Search', 2 => 'Front');
php > var_dump(array_diff_assoc($arr1, $arr2));
array(2) {
[2]=>
string(6) "Search"
[1]=>
string(5) "Front"
}