array_intersect()
не сравнивает ассоциативные ключи , он только смотрит на значения, вам нужно будет использовать array_intersect_assoc()
для сравнения ключа и значения . Однако эта функция будет сравнивать только базовый ключ, а не ключи вложенных массивов.
array_intersect_assoc($expected, $result);
Возможно, лучшее решение - использовать следующую технику, используя array_uintersect_assoc()
, где вы можете определить функцию сравнения.
<code>$intersect = array_uintersect_assoc($expected, $result, "comp"));
function comp($value1, $value2) {
if (serialize($value1) == serialize($value2)) return 0;
else return -1;
}
echo '<pre>';
print_r($intersect);
echo '
';
В дополнение к вашим комментариям следующий код должен возвращать все элементы в $result
с ожидаемой структурой, изложенной в $expected
.
<code>// get intersecting sections
$intersect = array_uintersect_assoc($expected, $results, "isStructureTheSame");
//print intersecting set
echo "<pre>";
print_r($intersect);
echo "
";
// выводим результаты, которые находятся в пересекающемся множестве (например, структура $ ожидаемого, значение $ результатов
echo "
";
print_r(array_uintersect_assoc($results, $intersect, "isStructureTheSame"));
echo "
";
function isStructureTheSame ($ x, $ y) {
if (! is_array ($ x) &&! is_array ($ y)) {
вернуть 0;
}
if (is_array ($ x) && is_array ($ y)) {
if (count ($ x) == count ($ y)) {
foreach ($ x как $ key => $ value) {
if (array_key_exists ($ key, $ y)) {
$ x = isStructureTheSame ($ value, $ y [$ key]);
if ($ x! = 0) return -1;
} еще {
возврат -1;
}
}
}
} еще {
возврат -1;
}
вернуть 0;
}