在PHP中减少数组以获得最小值[重复]

igetnqfo  于 2023-04-04  发布在  PHP
关注(0)|答案(3)|浏览(104)

此问题在此处已有答案

Find row in 2d array with specific value in a column and smallest value in another column(3个答案)
Get earliest Y-m-d date value in a multidimensional array from qualifying rows(5个答案)
5天前关闭。
假设我在PHP中有这个数组:

Array
(
    [0] => Array
        (
            [color] => Yellow
            [name] => Banana
            [quantity] => 124
        )
    [1] => Array
        (
            [color] => Red
            [name] => Cherry
            [quantity] => 24
        )
    [2] => Array
        (
            [color] => Yellow
            [name] => Apple
            [quantity] => 224
        )

)

如果出现以下情况,如何减少此数组:

  • color为黄色,
  • quantity最低

所以从上面的例子中,我应该只有这个数组:

Array
(
    [0] => Array
        (
            [color] => Yellow
            [name] => Banana
            [quantity] => 124
        )    
)

到目前为止我已经尝试过:

$min = array_reduce($array, function($min, $details) {
  return min($min, $details['quantity']);
}, PHP_INT_MAX);

谢谢你的帮助。

bvjxkvbb

bvjxkvbb1#

我试图创建一个更通用的通用函数,可以修改它以适应其他类似的场景,其中输入数组不一定包含问题中引用的键/值。

$src=array(
    array(
        'colour'=>'Red',
        'name'=>'raspberry',
        'qty'=>524
    ),
    array(
        'colour'=>'yellow',
        'name'=>'Banana',
        'qty'=>124
    ),
    array(
        'colour'=>'green',
        'name'=>'gooseberry',
        'qty'=>23
    ),
    array(
        'colour'=>'Red',
        'name'=>'Cherry',
        'qty'=>24
    ),
    array(
        'colour'=>'green',
        'name'=>'cucumber',
        'qty'=>457
    ),
    array(
        'colour'=>'yellow',
        'name'=>'Banana',
        'qty'=>225
    ),
    array(
        'colour'=>'purple',
        'name'=>'Plum',
        'qty'=>40
    ),
    array(
        'colour'=>'Red',
        'name'=>'strawberry',
        'qty'=>1245
    ),
    array(
        'colour'=>'green',
        'name'=>'lime',
        'qty'=>44520
    ),
    array(
        'colour'=>'yellow',
        'name'=>'mango',
        'qty'=>6225
    )
);

# criteria to apply to the filter
$key='colour';
$value='yellow';
$column='qty';
$dir='low';


function filter( $input, $key, $value, $column, $dir='low' ){
    # filter the array by matching desired field to desired value, ignoring case.
    $filtered=array_filter( $input, function( $item ) use( $key, $value ){
        return is_array( $item ) && strtolower( $item[ $key ] )==strtolower( $value );
    });
    
    # determine the sort order for the filtered results.
    $sort=$dir=='low' ? SORT_ASC : SORT_DESC;
    
    # find the columns by which final output is derived.
    $cols=array_column( $filtered, $column );
    
    # sort the columns.
    array_multisort( $cols, $sort, $filtered );
    
    # return the first item from filtered & now sorted data.
    return array_shift( $filtered );
}

# run the filter
$result=filter( $src, $key, $value, $column, $dir );

printf(
    '<pre>%s</pre>', 
    print_r( is_null( $result ) ? 'No results' : $result, true )
);

以上结果为:

Array
(
    [colour] => yellow
    [name] => Banana
    [qty] => 124
)

如果标准发生变化,并且您需要最高而不是最低,则可以通过修改$dir变量来快速实现。

gmxoilav

gmxoilav2#

我只会使用一个简单的循环,因为它是可读的,很容易理解发生了什么。

foreach($array as $arr) {
    if($arr['color'] == 'Yellow') {
        if(!isset($min) || $min['quantity'] > $arr['quantity']) {
            $min = $arr;
        }   
    }
}

print_r($min);

输出

Array
(
    [color] => Yellow
    [name] => Banana
    [quantity] => 124
)

如果你想让$min仍然是一个像你的例子输出一样的数组,你可以像这样把它添加到一个数组中。

if(isset($min)) $min = [$min];

输出

Array
(
    [0] => Array
        (
            [color] => Yellow
            [name] => Banana
            [quantity] => 124
        )

)
0lvr5msh

0lvr5msh3#

可能的解决方案。
该解决方案考虑了申请人已经创建的内容,完成代码以获得所需的结果。

$filtered = array_filter ($array, fn ($v) =>  $v['color'] == 'Yellow');
$min = array_reduce($filtered, fn ($minVal, $v) => min($minVal, $v['quantity']), PHP_INT_MAX);
$filtered = array_filter ($filtered, fn ($v) => $v['quantity'] == $min);

print_r ($filtered);

第一个array_filter选择所有color = 'Yellow'的行,减少要处理的数据集。
使用array_reduce,我们可以找到数量的最小值,就像@F_M所做的那样,但是在较小的数据集上。
最后,使用另一个array_filter,我们将提取具有刚刚找到的值的行。

相关问题