Если в столбце массива есть несколько записей с одинаковым значением - взять одну запись с минимальным значением другого столбца - PullRequest
0 голосов
/ 01 июля 2019

У меня многомерный массив выглядит следующим образом:

Array3: [
    0 => array:2 [
            model_id => 1
            price => 2000
         ]      
    1 => array:2 [
            model_id => 2
            price => 3000
         ]
    2 => array:2 [
            model_id => 1
            price => 1500
         ]
   ]

Теперь мне нужно проверить, встречается ли значение model_id более одного раза, если так, то мне нужно взять этот, где значение цены ниже.В этом примере у меня есть model_id = 1 дважды, поэтому я должен взять второй, потому что у него самая низкая цена.

Как я могу это сделать?Я пробовал следующие методы:

как я могу получить дубликат многомерного массива в php

PHP: проверка на наличие дублирующихся значений в многомерном массиве

Поиск повторяющихся значений в многомерном массиве

Но я до сих пор не могу решить проблему.Результирующий массив должен выглядеть так:

Array2: [
    0 => array:2 [
            model_id => 2
            price => 3000
         ]
    1 => array:2 [
            model_id => 1
            price => 1500
         ]
   ]

Ответы [ 6 ]

1 голос
/ 01 июля 2019

Вы можете отсортировать по убыванию по price, затем извлечь и индексировать по model_id, чтобы последний (самый низкий price из каждого model_id индекса) переписал остальные:

array_multisort(array_column($array, 'price'), SORT_DESC, $array);
$result = array_column($array, null, 'model_id');
1 голос
/ 01 июля 2019

Вы можете воспользоваться преимуществами ключей ассоциативного массива для обеспечения уникальности и сравнения цен:

<?php
// Our data
$array = [
    [ 'model_id' => 1, 'price' => 2000 ],
    [ 'model_id' => 2, 'price' => 3000 ],
    [ 'model_id' => 1, 'price' => 1500 ]
];

// Store the final result
$result = [];

// Loop the data
foreach( $array as $v )
{
    // If this model_id has not been encountered or if the price is lower than what's stored then make it the new price
    if( !isset( $output[ $v[ 'model_id' ] ] ) || $v[ 'price' ] < $output[ $v[ 'model_id' ] ][ 'price' ] )
    {
        $output[ $v[ 'model_id' ] ] = $v;
    }
}

// Get rid of the unique keys
$output = array_values( $output );

print_r( $output );

Выходы:

Array
(
    [0] => Array
        (
            [model_id] => 1
            [price] => 1500
        )

    [1] => Array
        (
            [model_id] => 2
            [price] => 3000
        )

)
1 голос
/ 01 июля 2019

Простой foreach должен сделать это следующим образом:

foreach($arr as $e) {
    if (isset($res[$e["model_id"]]))
        $res[$e["model_id"]]["price"] = min($res[$e["model_id"]]["price"], $e["price"]);
    else $res[$e["model_id"]] = $e;
}

Живой пример: 3v4l

0 голосов
/ 01 июля 2019

Вы можете использовать функцию массива usort для получения первых записей минимальных значений, затем использовать временный массив и запустить функцию foreach для удаления дубликатов записей.

У меня ниже код работает нормально.

<?php


$arr = array(
        [   
            'model_id' => 1,
            'price' => 2000
        ],
        [
            'model_id' => 2,
            'price' => 3000
        ],
        [
            'model_id' => 1,
            'price' => 1500
        ]
    );

    usort($arr, function ($a, $b) {
        return $a['price'] - $b['price'];
    });

    $input = $arr;
    $temp  = array();
    $keys  = array();

    foreach ( $input as $key => $data ) {
        unset($data['price']);
        if ( !in_array($data, $temp) ) {
            $temp[]     = $data;
            $keys[$key] = true;
        }
    }

    $output = array_intersect_key($input, $keys);

    print_r($output);
0 голосов
/ 01 июля 2019

Вот еще один метод,

function array_column1($input, $column_key = null, $index_key = null)
{
    $result = [];
    $i      = 0;
    foreach ($input as $v) {
        $k            = $index_key === null || !isset($v[$index_key]) ? $i++ : $v[$index_key];
        // fetching all the values for model id
        $result[$k][] = $column_key === null ? $v : (isset($v[$column_key]) ? $v[$column_key] : null);
    }
    // fetching minimum for every model_id
    $result = array_map("min", $result);
    return $result;
}
$temp = array_column1($arr, 'price', 'model_id');

Демо .

Я использовал эту функцию с официального php doc .

0 голосов
/ 01 июля 2019

Вы можете сгруппировать их по model_id, чем использовать min функцию

$groupByModelId = [];
foreach($a as $v){
  $groupByModelId[$v['model_id']][] = $v['price'];
}
$searchModelId = 1;
echo min($groupByModelId[$searchModelId]);

Рабочая ДЕМО

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