php сравнивает многомерный массив и извлекает перекрывающиеся значения - PullRequest
1 голос
/ 20 июня 2011

Я работаю над некоторыми юнит-тестами.Мои результаты - большие многомерные массивы.Я не хочу сравнивать весь массив, а только несколько ключей в этой «иерархической структуре».Вот фрагмент моего ожидаемого массива:

    $expected = array(
        'john' => array(
            'maham' => 4563,
        ),
        'gordon' => array(
            'agrar' => array(
                'sum' => 7895,
            ),
        ),
        'invented' => 323,
    );

Массив результатов больше, но есть некоторые записи, которые совпадают с моими ожидаемыми.Поэтому я хочу сравнить их.Если значения равны.

Я пробовал некоторые функции array_intersect, diff, но кажется, что они не работают с многомерным массивом.мой ожидаемый массив и получить соответствующий ключ из результирующего массива?Что-то вроде указателя или ссылки?

Ответы [ 2 ]

3 голосов
/ 20 июня 2011

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; }
2 голосов
/ 20 июня 2011

Я знал, что должен быть способ решить эту проблему!Его array_replace_recursive!

$expected = array_replace_recursive($result, array(
    /* expected results (no the whole array) */
));

// $expected is now exactly like $result, but $values differ.
// Now can compare them!
$this->assertEquals($expected, $result);

Это решение!

...