如果数组列中有多条记录具有相同的值,请选择一条记录,而其他列的最小值为

时间:2019-07-01 13:40:56

标签: php arrays laravel

我的多维数组看起来像这样:

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,所以我应该选择第二个,因为价格最低。

我该怎么做?我尝试过这种方法:

how can I get the duplicate multidimensional array in php

PHP: Check for duplicate values in a multidimensional array

Finding Duplicate Values in Multi-dimensional Array

但是我仍然无法解决这个问题。结果数组应如下所示:

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

6 个答案:

答案 0 :(得分:1)

简单的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;
}

实时示例:Responsive width Facebook Page Plugin

答案 1 :(得分:1)

您可以利用关联数组键来实现唯一性并比较价格:

<?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
        )

)

答案 2 :(得分:1)

您可以按price降序排列,然后在model_id上提取索引并建立索引,以便最后一个索引(每个price索引的最低model_id)将覆盖其他索引:< / p>

array_multisort(array_column($array, 'price'), SORT_DESC, $array);
$result = array_column($array, null, 'model_id');

答案 3 :(得分:0)

与使用model_id函数相比,您可以按min对它们进行分组

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

Working DEMO

答案 4 :(得分:0)

这是另一种方法,

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');

Demo

我从官方php doc使用了此功能。

答案 5 :(得分:0)

您可以使用usort数组函数获取第一个最小值记录,然后使用temp数组并运行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);