нужно сравнить несколько ассоциативных массивов, которые относятся к друг другу, как 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. Но если были найдены не все. то ошибка.
Если я правильно понял, вам нужно сравнить элементы первого массива с элементами всех остальных массивов, и получить в результат массив элементов из первого массива, которых не оказалось во втором - для этого можно использовать 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
Кхм, пусть будет третий вариант ответа с 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);
Я думаю, вы справитесь с тем, чтоб переорганизовать ваши массивы, разделив на группы для сравнения:
$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
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Есть 2 сайта из первого надо отправить массив POST, а на втором принять и обработать, делаю таким образом: На сайте "http://test1com" отправляю таким...
В интернете куча информации о докере по базовым вещам, таких как "как скачать образ", "как запустить контейнер", но почти ничего нет о том, что...