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

У меня есть два массива — $ продуктов а также $ userProducts (это нужно сделать двумя запросами, поскольку я ищу товары по названию, и есть еще одна таблица, в которой я храню товары, которые пользователь хочет продать, и я хочу показать пользователю, что он уже поставил этот товар для продажа).

массив продуктов выглядит так:

[
'id' => 1,
'name' => 'product name',
'synonim' => 'synonim'...

],
[
'id' => 2,
'name' => 'product name 2',
'synonim' => 'synonim'...

]....

а также $ userProducts выглядит так:

[
'product_id' => 1
],
[
'product_id' => 75
]

Я хочу добавить атрибут к $ продуктов массив (или, если есть лучший способ сделать это, это также может работать) 'userHasProduct' => true, если $ userProducts содержит Код товара какие математики с Я бы от $ продуктов Я бы. Как я могу сделать эту работу?

2

Решение

Согласитесь с @Erik, что если вы сможете изменить свой исходный запрос, то это, вероятно, лучше всего решить на уровне базы данных. Если нет, то вы можете использовать что-то вроде этого:

$products = array_map(function ($product) use ($userProducts) {
if (in_array($product['id'], array_column($userProducts, 'product_id'))) {
$product['found_in_user_products'] = true;
}

return $product;
}, $products);

Это будет зацикливаться на каждой записи в вашем $products массив и сравнить идентификатор со списком в $userProducts, Если он найден, то он устанавливает found_in_user_products ключ к истине.

Рабочий пример: https://eval.in/858063

Для справки, чтобы решить это в SQL, вероятно, будет выглядеть примерно так:

   Select p.id, p.name, p.synonim, count(up.product_id)
From products p
Left Join user_products up On p.id = up.product_id
Group By p.id, p.name, p.synonim

Хотя, очевидно, не видя вашей схемы, трудно сказать точно

4

Другие решения

Если запрос LEFT JOIN действительно не решит проблему (что, я думаю, так и есть, кстати), я бы тогда порекомендовал что-то вроде этого:

// flatten the array
$ids = array_map( function( $row ) {
return $row['product_id'];
}, $row );

// loop over products (by reference)
foreach( $products AS &$row ) {
// if the product ID is in the user's IDs array, set flag
if ( in_array($row['product_id'], $ids ) {
$row['userHasProduct'] = TRUE;
}
}
1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector