PHP で次の 2 つの配列を使用します。
$array1 = [
2 => 'Search',
1 => 'Front-End / GUI'
];
$array2 = [
1 => 'Front-End / GUI',
2 => 'Search'
];
配列比較関数のほとんどは順序を気にしません。を実行するarray_diff
と、空の配列になります。
順序に関して2つの配列を比較する最も効率的/最短/クリーンな方法は何ですか?
- 等しいかどうか (真/偽) を示しますか?
- 違いを示しますか (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'
)
更新 - 解決策
これは、すべての要素が同じで、順序が異なる場合にのみ、一種の差分を生成します。PHP単体テスト:
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;
}