У меня такой ассоциативный массив

Array
(
    [0] => Array
        (
            [id] => 1,
            [product_uname] => AI 92
            [price_per_l] => 44.82
        )

    [1] => Array
        (
            [id] => 2
            [product_uname] => AI 95
            [price_per_l] => 46.43
        )

    [2] => Array
        (
            [id] => 3
            [product_uname] => AI 95
            [price_per_l] => 46.35
        )

    [3] => Array
        (
            [id] => 4
            [product_uname] => AI 92
            [price_per_l] => 44.19
        )

    [4] => Array
        (
            [id] => 5
            [product_uname] => AI 100
            [price_per_l] => 53.03
        )

)

Мне нужен массив фильтров, в котором мы группируемся по полю ['product_uname'] и извлекаем после группировки только один уникальный элемент с наименьшим ценовым полем [price_per_l] и сортируем массив по полю [product_uname], после этого мне нужно увидеть

Array
(
    [0] => Array
        (
            [id] => 1
            [product_uname] => AI 92
            [price_per_l] => 44.19 (min value price where product_uname = AI 92)
        )

    [1] => Array
        (
            [id] => 2
            [product_uname] => AI 95
            [price_per_l] => 46.35 (min value price where product_uname = AI 95)
        )


    [2] => Array
        (
            [id] => 3
            [product_uname] => AI 100
            [price_per_l] => 53.03 (min value price because there is no any product_name = AI 100)
        )

)

Можно ли творить без петель

-1
Damir Shaykxutd 16 Сен 2021 в 19:19

3 ответа

Лучший ответ

Если вы отсортируете по price_per_l по убыванию, а затем проиндексируете массив по product_uname, то вы получите только самые низкие элементы, поскольку более поздние элементы заменят предыдущие, а более поздние элементы имеют самую низкую цену:

array_multisort(array_column($array, 'price_per_l'), SORT_DESC, $array);
$array = array_column($array, null, 'product_uname');

При необходимости вы можете переиндексировать:

$array = array_values($array);
1
AbraCadaver 16 Сен 2021 в 16:51

Я бы сделал так:

<?php
    $new_array = array();

    foreach($original_array as $key=>$item) {
      if(!isset($new_array[$item['product_uname']])) {
              //There isn't an item for this group in array, save this
            $new_array[$item['product_uname']] = $item;
      } else {
           if($new_array[$item['product_uname']]['price_per_l'] > $item['price_per_l']) {
              //If current item of group has higher price, replace it with this
              $new_array[$item['product_uname']] = $item;  
           }
      }
      
    }
0
edluis97 16 Сен 2021 в 16:29
$array = Array
(
    [0] => Array
        (
            [id] => 1,
            [product_uname] => AI 92
            [price_per_l] => 44.82
        )

    [1] => Array
        (
            [id] => 2
            [product_uname] => AI 95
            [price_per_l] => 46.43
        )

    [2] => Array
        (
            [id] => 3
            [product_uname] => AI 95
            [price_per_l] => 46.35
        )

    [3] => Array
        (
            [id] => 4
            [product_uname] => AI 92
            [price_per_l] => 44.19
        )

    [4] => Array
        (
            [id] => 5
            [product_uname] => AI 100
            [price_per_l] => 53.03
        )

);

array_multisort(array_column($array, 'price_per_l'), SORT_ASC, $array);
$array = array_column($array, null, 'product_uname');
$array = array_values($array);

0
Damir Shaykxutd 16 Сен 2021 в 18:20