Как я могу сравнить два вложенных массива в PHP?

Недавно я столкнулся с проблемой при сравнении двух вложенных массивов. Я пробовал использовать array_diff_assoc для сравнения двух массивов, но он возвращает мне неверное значение. Ниже приведены несколько сценариев, в которых я пытаюсь сравнить эти два вложенных массива в php.

$arr1 = ["colorFamily"=>[]];
$arr2 = ["colorFamily"=>["blue","black"]];
$diff = array_diff_assoc($arr1,$arr2);

Ожидается, что $diff вернется ниже;

["colorFamily"=>[]]

К сожалению, он возвращается ниже:

[]

Кроме того, при сравнении будут использоваться более сложные сценарии, такие как

$arr1 = ["colorFamily"=>[],"descriptionMeasurement"=>[["label"=>"orange"],["value"=>"apple"]]];
$arr2 = ["colorFamily"=>["blue","black"],"descriptionMeasurement"=>[["label"=>"orange"]]];

Вышеупомянутый сценарий должен вернуться

["colorFamily"=>[],"descriptionMeasurement"=>[["label"=>"orange"]]].

Короче говоря, все, что происходит в $arr1 и не происходит в $arr2, должно вернуться в массив $diff. Я надеюсь, что вы, ребята, можете помочь мне решить эту проблему, я застрял в течение нескольких недель.


person Miracle Hades    schedule 25.06.2021    source источник
comment
Надеюсь, это поможет вам (посмотрите на второе решение): stackoverflow.com/questions/7389176/   -  person Mubashar Ahmed Hassan    schedule 25.06.2021
comment
Привет, Хасан, я перешел по предоставленной вами ссылке, и мне не удалось найти подходящее решение для решения моей проблемы.   -  person Miracle Hades    schedule 25.06.2021


Ответы (1)


С помощью array_diff вы всегда должны сначала помещать массив с отсутствующими значениями, иначе он ничего не вернет.

Также он не может видеть дальше первого массива. Итак, что-то вроде этого будет работать:

$diff = array_diff_assoc($arr2["colorFamily"], $arr1["colorFamily"])

Вы также можете использовать следующее. array_map используется для индексации ключей:

$missing = array_map('unserialize', array_diff(array_map('serialize', $arr2), array_map('serialize', $arr1)));

(кредиты: Используйте array_diff_assoc() или получите разницу многомерных массивы)

person hixlax    schedule 25.06.2021
comment
Привет, мое сравнение сценариев может быть n-уровневым многомерным массивом. Я протестировал ваше решение, но оно соответствует тому, что я ищу. - person Miracle Hades; 25.06.2021
comment
Ах позор. Возможно, вам следует перебирать их в цикле вместо использования array_diff, потому что он имеет довольно ограниченные варианты использования. - person hixlax; 25.06.2021