Сравнение ассоциативных массивов php

242
11 февраля 2018, 01:09

нужно сравнить несколько ассоциативных массивов, которые относятся к друг другу, как 1:м. Все реквизиты в массивах разбиты на группы с сходными именами например a1, a2, a3,a4` и т.д. Например: есть массивы основной вида

array(
    'a1' =>1,
    'a2' =>2,
    'a3' =>3,
    'b1' =>1,
    'b2' =>2,
    'b3' =>3
);

Ну и соответственно дополнительный массив

array(
   '0' => array(
                'c1' => 2,
                'c2' => 1,
                'd1' => 1,
                'd2' => 2,  
         ),
  '1' => array(
               'c1' => 3,
               'c2' => 4,
               'd1' => 4,
               'd2' => 5,   
   )
);

Как видно из примера, основной массив один, дополнительных несколько.

Реквизиты в основном и дополнительных массивах в сравниваемых группах называются по разному. Заранее известно какие реквизиты должны совпасть в основном массиве и дополнительных.

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

Судя из примера сравниваем группу реквизитов в основном группу реквизитов А, в дополнительных группу реквизитов C

[a1] = [0][c2], 
[a2] = [0][c1],
[a2] = [1][c1].

УСПЕХ все значения основного массива были найдены в дополнительных массивах.

Чего не скажешь группе b и группе d дополнительного

[b1] = [0][d1],
[b2] = [0][d1], [d2] 

– в дополнительных массивах, соответственно это ошибка. Так вот, как лучше это сделать, никак придумаю, как это лучше сравнить, и получить ответы что не сошлось. Заранее благодарен за ваши дельные мысли))

Забыл важный момент, дополнительных массивов может быть 1, а может быть очень много (50 и более). И что должно быть, если например в Группе А имеется 3 различных значения, и они все были найдены в значениях реквизитов соответствующей группы (в данном случае С) дополнительных массивов, то все хорошо, да же если в дополнительных массивах соответствующей группы различных значений гораздо больше чем 3. Но если были найдены не все. то ошибка.

Answer 1

Если я правильно понял, вам нужно сравнить элементы первого массива с элементами всех остальных массивов, и получить в результат массив элементов из первого массива, которых не оказалось во втором - для этого можно использовать array_diff() в комбинации с array_map():

$arr_1 = array(
    'a1' =>1,
    'a2' =>2,
    'a3' =>3,
    'b1' =>1,
    'b2' =>2,
    'b3' =>3
);
$arr_2 = array(
    '0' => array(
        'c1'=> 2,
        'c2'=> 1,
        'd1'=> 1,
        'd2'=> 2,
    ),
    '1' => array(
        'c1'=> 3,
        'c2'=> 4,
        'd1'=> 4,
        'd2'=> 5,
    )
);

$result = array_map(function($a)use($arr_1){
    return array_diff($arr_1, $a);
}, $arr_2);
var_dump($result);

В результате будет двумерный массив, состоящий из элементов первого массива, которые не найдены во втором:

array (size=2)
  0 => 
    array (size=2)
      'a3' => int 3
      'b3' => int 3
  1 => 
    array (size=4)
      'a1' => int 1
      'a2' => int 2
      'b1' => int 1
      'b2' => int 2
Answer 2

Кхм, пусть будет третий вариант ответа с diff, раз уже написал код.

исходные массивы

$src = [ 'a1' =>1, 'a2' =>2, 'a3' =>3, 'b1' =>1, 'b2' =>2, 'b3' =>3 ];
$check = [
            ['c1' => 2, 'c2' => 1, 'd1' => 1, 'd2' => 2,],
            ['c1' => 3, 'c2' => 4, 'd1' => 4, 'd2' => 5,]
        ];

сравниваемые категории

$srcCat = 'a';
$checkCat = 'c';

фильтруем исходный по нужным категориям

$src_filter = array_filter($src, function($k) use ($srcCat){
                        return mb_strpos($k, $srcCat) === 0;
                    }, ARRAY_FILTER_USE_KEY);

и результат тоже фильтруем

$check_filter = [];
array_walk_recursive($check, function($v, $k) use (&$check_filter, $checkCat){
    if(mb_strpos($k, $checkCat) === 0) $check_filter[] = $v;
});

сравниваем результаты

$diff = array_diff($src_filter, $check_filter);

если $diff не пуст, то видимо это не успешное завершение вашего алгоритма.

print_r($diff);
Answer 3

Я думаю, вы справитесь с тем, чтоб переорганизовать ваши массивы, разделив на группы для сравнения:

$arr1 = [
  'a' => [
    1,
    2,
    3,
  ],
  'b' => [  
    1,
    2,
    3
  ]  
];
$arr2 = [
  'c' => [
    2,
    1,
    3,
    4,
  ],
  'd' => [
    1,
    2,  
    4,
    5,   
   ]
];

А дальше всё очень просто:

if(! array_diff($arr1['a'], $arr2['c']))
  echo 'успех';
else 
  echo 'всё пропало!';

demo

READ ALSO
получить массив POST с другого сайта в wordpress

получить массив POST с другого сайта в wordpress

Есть 2 сайта из первого надо отправить массив POST, а на втором принять и обработать, делаю таким образом: На сайте "http://test1com" отправляю таким...

240
Не записывает в многомерный массив

Не записывает в многомерный массив

Изначально файл datajson пустой

201
Не выполняется php в html файлах

Не выполняется php в html файлах

Я добавил вhtaccess запись AddType application/x-httpd-php

208
Как разрабатывать через связку PhpStorm + Docker?

Как разрабатывать через связку PhpStorm + Docker?

В интернете куча информации о докере по базовым вещам, таких как "как скачать образ", "как запустить контейнер", но почти ничего нет о том, что...

334