Получить 3 элемента на категорию из массива в PHP - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть 2 массива category и product_to_category (структура показана ниже)

[category] => Array
    (
        [0] => 299
        [2] => 342
        [3] => 134
        [4] => 333
        [5] => 347
        [9] => 296
    )

И

[product_to_category] => Array
    (
        [0] => Array
            (
                [product_id] => 23895
                [category_id] => 296
                [relevance] => 77.73432159423828
            )

        [1] => Array
            (
                [product_id] => 17218
                [category_id] => 296
                [relevance] => 77.73432159423828
            )

        [2] => Array
            (
                [product_id] => 23896
                [category_id] => 347
                [relevance] => 77.73432159423828
            )
            ....So On (5000+ records)

У меня есть почти 5000+ записей в массиве product_to_category, но я хочу выбрать только 3 продукта из массива P2C для каждой категории. Например, category_id=299, так что 3 продукта из 299 будут добавлены в мой новый массив и то же самое для других категорий.

Есть ли какой-нибудь возможный способ сделать это.

Ответы [ 4 ]

0 голосов
/ 04 апреля 2019

попробуйте этот код

$collection = array();

foreach($arr as $key => $value){
    if(
      isset($collection[$value['category_id']])
      && 
      count($collection[$value['category_id']]) >= 3
    ) continue;

   $collection[$value['product_id']][] = $value['product_id']; 

}

Таким образом, вы получите 3 продукта из каждой категории.

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

&& in_array($product_id, $collection[$value['category_id']])
0 голосов
/ 03 апреля 2019
$category = [0 => 299, 2 => 342, 3 => 134, 4 => 333, 5 => 347, 9 => 296];
 $product_to_category = Array
  (
    0 => Array
    (
        'product_id' => 23895,
        'category_id' => 296,
        'relevance' => 77.73432159423828
    ),

    1 => Array
    (
        'product_id' => 17218,
    'category_id' => 296,
    'relevance' => 77.73432159423828
    ),

    2 => Array
    (
        'product_id' => 23896,
        'category_id' => 347,
        'relevance' => 77.73432159423828
    ),
    3 => Array
    (
        'product_id' => 23897,
        'category_id' => 296,
        'relevance' => 77.73432159423828
    ),
    4 => Array
    (
    'product_id' => 23899,
    'category_id' => 296,
    'relevance' => 77.73432159423828
   ),
   5 => Array
   (
    'product_id' => 23894,
    'category_id' => 347,
    'relevance' => 77.73432159423828
   ),
   6 => Array
   (
    'product_id' => 23892,
    'category_id' => 347,
    'relevance' => 77.73432159423828
   ),
   7 => Array
   (
    'product_id' => 23833,
    'category_id' => 347,
    'relevance' => 77.73432159423828
   )
);
$new_product_to_category = [];
foreach ($category as $categories) {
$count_category_ids = [];
$i=0;
foreach ($product_to_category as $product_to_categories){
    if ($categories == $product_to_categories['category_id']){
        $count_category_ids[] = $product_to_categories['category_id'];
        if (count($count_category_ids) < 4) {
            $new_product_to_category[$i]['product_id'] = $product_to_categories['product_id'];
            $new_product_to_category[$i]['category_id'] = $product_to_categories['category_id'];
            $new_product_to_category[$i]['relevance'] = $product_to_categories['relevance'];
        }
    }
    $i++;
}
}

echo "<pre>";
print_r($new_product_to_category);

Вывод показывает так:

Array
(
[2] => Array
    (
        [product_id] => 23896
        [category_id] => 347
        [relevance] => 77.734321594238
    )

[5] => Array
    (
        [product_id] => 23894
        [category_id] => 347
        [relevance] => 77.734321594238
    )

[6] => Array
    (
        [product_id] => 23892
        [category_id] => 347
        [relevance] => 77.734321594238
    )

[0] => Array
    (
        [product_id] => 23895
        [category_id] => 296
        [relevance] => 77.734321594238
    )

[1] => Array
    (
        [product_id] => 17218
        [category_id] => 296
        [relevance] => 77.734321594238
    )

[3] => Array
    (
        [product_id] => 23897
        [category_id] => 296
        [relevance] => 77.734321594238
    )

 )
0 голосов
/ 03 апреля 2019
$categories = array(6, 5, 3, 4, 2, 1);
        $products = array(
            array('product_id' => 231, 'category_id' => 1, 'relevance' => 321),
            array('product_id' => 232, 'category_id' => 4, 'relevance' => 322),
            array('product_id' => 233, 'category_id' => 2, 'relevance' => 323),
            array('product_id' => 234, 'category_id' => 4, 'relevance' => 324),
            array('product_id' => 235, 'category_id' => 4, 'relevance' => 325),
            array('product_id' => 236, 'category_id' => 2, 'relevance' => 326),
            array('product_id' => 237, 'category_id' => 1, 'relevance' => 327),
            array('product_id' => 238, 'category_id' => 4, 'relevance' => 328),
            array('product_id' => 239, 'category_id' => 1, 'relevance' => 329),
            array('product_id' => 240, 'category_id' => 1, 'relevance' => 330)
        );
        $categoryWiseProduct = array();
        foreach ($products as $p) {
            foreach ($categories as $c) {
                if ($c == $p['category_id']) {
                    if (isset($categoryWiseProduct[$c]) && count($categoryWiseProduct[$c]) > 2) {
                        break;
                    }
                    $categoryWiseProduct[$c][] = $p;
                }
            }
        }
        echo'<pre>';print_r($categoryWiseProduct);die;

Вывод будет:

Array
(
    [1] => Array
        (
            [0] => Array
                (
                    [product_id] => 231
                    [category_id] => 1
                    [relevance] => 321
                )

            [1] => Array
                (
                    [product_id] => 237
                    [category_id] => 1
                    [relevance] => 327
                )

            [2] => Array
                (
                    [product_id] => 239
                    [category_id] => 1
                    [relevance] => 329
                )

        )

    [4] => Array
        (
            [0] => Array
                (
                    [product_id] => 232
                    [category_id] => 4
                    [relevance] => 322
                )

            [1] => Array
                (
                    [product_id] => 234
                    [category_id] => 4
                    [relevance] => 324
                )

            [2] => Array
                (
                    [product_id] => 235
                    [category_id] => 4
                    [relevance] => 325
                )

        )

    [2] => Array
        (
            [0] => Array
                (
                    [product_id] => 233
                    [category_id] => 2
                    [relevance] => 323
                )

            [1] => Array
                (
                    [product_id] => 236
                    [category_id] => 2
                    [relevance] => 326
                )

        )

)
0 голосов
/ 03 апреля 2019

Попробуйте этот запрос, чтобы получить нужную запись,

select p2c.product_id, p2c.category_id, p2c.relevance
from category c 
LEFT JOIN product_to_category p2c ON p2c.category_id = category.category_id
GROUP BY p2c.product_id, p2c.category_id
HAVING count(*) <= 3
ORDER BY category_id, product_id

Вы можете отнести таблицу category к таблице категорий и product_to_category к имени таблицы в базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...