Сравнить два массива [PHP]

MW
На сайте с 07.09.2011
Offline
55
1026

Всем привет,че-то не соображу,как вытащить из array1 product_id,если в array2 нет совпадений с id,поделитесь мыслями

array1

Array

(
[0] => Array
(
[product_id] => 407
[price_retail] => 399
[date_change] => 2016-10-24 18:20:43
[video] => vun6t8
)

[1] => Array
(
[product_id] => 138
[price_retail] => 149
[date_change] => 2017-06-27 15:33:42
[video] => 0yzJQQ
)

[2] => Array
(
[product_id] => 142
[price_retail] => 399
[date_change] => 2017-10-30 06:41:54
[video] => 6qMabU
)

[3] => Array
(
[product_id] => 155
[price_retail] => 199
[date_change] => 2018-01-09 14:02:04
[video] => tOTidcI
)

[4] => Array
(
[product_id] => 180
[price_retail] => 119
[date_change] => 2017-10-19 19:37:48
[video] => dyBmiFM
)

[5] => Array
(
[product_id] => 199
[price_retail] => 249
[date_change] => 2017-06-27 15:40:16
[video] => xB7PpvhTbfQ
)
)

array2

Array

(
[0] => Array
(
[id] => 407
)

[1] => Array
(
[id] => 5788
)

[2] => Array
(
[id] => 142
)

[3] => Array
(
[id] => 2088
)
)
LEOnidUKG
На сайте с 25.11.2006
Offline
1774
#1

Перебрать первый и сравнить со значением второго как вам идея?

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/ ✅ Настройка и оптимизация серверов https://getmanyspeed.ru/
MW
На сайте с 07.09.2011
Offline
55
#2
LEOnidUKG:
Перебрать первый и сравнить со значением второго как вам идея?

в том-то и дело,че-то совсем затупил:

foreach($array1 as $key1 => $item1) {

foreach($array2 as $key2 => $item2) {

if($item1['product_id'] != $item2['id']) {

если != то получается бред

}

}

}

LEOnidUKG
На сайте с 25.11.2006
Offline
1774
#3

Откройте для себя оператор for и с ним работайте.

Samail
На сайте с 10.05.2007
Offline
369
#4
MilkeyWay:
foreach($array2 as $key2 => $item2) {
if($item1['product_id'] != $item2['id']) {
если != то получается бред
}
}

Может вместо второго цикла:

if(array_search($item1['product_id'], array_column($array2, 'id')) !== false){continue;}

else{echo $item1['product_id'];}
MW
На сайте с 07.09.2011
Offline
55
#5
Samail:
Может вместо второго цикла:
if(array_search($item1['product_id'], array_column($array2, 'id')) !== false){continue;}

else{echo $item1['product_id'];}

вроде работает,спасибо! пойду почитаю об этих функциях(array_search / array_column),чтобы разобраться,что тут к чему

MK
На сайте с 18.08.2005
Offline
126
#6
если != то получается бред

Проще взять заведомо больший массив перебрать 1 раз его и получить

$exists[$id]=1;

а далее меньшенький:

foreach($drugoi_array as $item) {

if( isset($exists[$item['product_id/id']]) ) {
....
}
}

Ну или модно

function q($a, $b) {

#проверки массивы ли $a, $b и имеют ли соотв. индексы на вас
return ($a['product_id'] - $b['id']);
#или как вам там надо: return !($a['product_id'] - $b['id']);
}
print_r( array_uintersect_assoc($a1, $a2, 'q') );

А еще лучше, сбегать выше и подправить функционал своей надстройки на pdo/mysqli, чтобы

[407] => Array

(
[product_id] => 407
[price_retail] => 399
[date_change] => 2016-10-24 18:20:43
[video] => vun6t8
)

ИД ведь уникальные?

Решений как оказалось много, остается выбрать лучшее:)

нет
Joker-jar
На сайте с 26.08.2010
Offline
171
#7

Согласен с предыдущим автором. Тут важнее не искать решение, а правильно сформировать данные.

MW
На сайте с 07.09.2011
Offline
55
#8
Marat_Kh:

А еще лучше, сбегать выше и подправить функционал своей надстройки на pdo/mysqli, чтобы

[407] => Array
(
[product_id] => 407
[price_retail] => 399
[date_change] => 2016-10-24 18:20:43
[video] => vun6t8
)

ИД ведь уникальные?

Решений как оказалось много, остается выбрать лучшее:)

что-то не совсем понял про последнее,можно по подробнее?

MK
На сайте с 18.08.2005
Offline
126
#9
что-то не совсем понял про последнее,можно по подробнее?

Это, если у вас массивы или хотя бы 1 из них, это выборка из бд и вы добавите в свой класс работы с бд функцию

$r = $db->rows_by_fld($sql, $a=null, $fld=null), которая вернет массив, ключами которого будут $fld, если он не null и pri или unique, то упростите подобные задачи - пересечение массивов.

Получиться д/б может как то так:


$db->rows_by_fld($sql1, $a1, 'product_id')=[ 199=>['product_id' => 199,
'price_retail' => 249,
'date_change' => '2017-06-27 15:40:16',
'video' => 'xB7PpvhTbfQ'],
....
]
$db->rows_by_fld($sql2, $a2, 'id')=[ 407 => [ 'id' => 407,
],
....
]

$raznica=array_diff (

array_keys($db->rows_by_fld($sql1, $a1, 'product_id')),
array_keys($db->rows_by_fld($sql2, $a2, 'id'))
);#проверки is_array как обычно на вас

Если ваши массивы, это внешние json/xml, то забейте, но, такая функция для бд ( а может и json/xml) еще много где будет полезна.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий