Php 按最低价格筛选多维数组

Php 按最低价格筛选多维数组,php,multidimensional-array,array-filter,Php,Multidimensional Array,Array Filter,我正在使用一个我想筛选的数组,因此它只包含每个键的最低价格。所以50只会有一个单位,和100一样,这个单位是最低的价格 下面是我正在使用的示例: $units = [ 50 => [ 41788 => ['StdRate' => 231.0000, 'UnitName' => "NN23"], 46238 => ['StdRate' => 303.0000, 'UnitName' => &quo

我正在使用一个我想筛选的数组,因此它只包含每个键的最低价格。所以50只会有一个单位,和100一样,这个单位是最低的价格

下面是我正在使用的示例:

$units = [
    50 => [
        41788 => ['StdRate' => 231.0000, 'UnitName' => "NN23"],
        46238 => ['StdRate' => 303.0000, 'UnitName' => "1038"],
        46207 => ['StdRate' => 303.0000, 'UnitName' => "1007"]
    ],
    100 => [
        41570 => ['StdRate' => 299.0000, 'UnitName' => "HH18"],
        46214 => ['StdRate' => 388.0000, 'UnitName' => "1014"]
    ]
];
我想避免使用复杂的foreach循环来实现这一点,所以我认为使用
array\u filter
会很好,但我很难对其进行仔细思考。还是一个
foreach
最好

$filtered = array_filter($units, function($a) {

});
预期产出:

[
    50 => [
        41788 => ['StdRate' => 231.0000, 'UnitName' => "NN23"]
    ],
    100 => [
        41570 => ['StdRate' => 299.0000, 'UnitName' => "HH18"]
    ]
];

这是一个函数,它将遍历多维数组并获取最低的单位。它将保留大阵列(50100)的钥匙和它抓取的单元(4178841570)的钥匙。它将不保留相同低速率的多个值。在这些情况下,它将返回找到的最低值中的第一个。可能不完全是您想要的,但这应该是一个好的开始,您可以随时修改它以后。它使用嵌套的
foreach
来完成其工作

希望这对你有帮助

function findLows($big) {
    $lowUnits = array();
    foreach($big as $id => $array) {
        $low = false;
        $prev = false;
        foreach($array as $k => $a) {
            if(!$low) {
                $low = $k;
                $prev = $a['StdRate'];
            } else {
                if($a['StdRate'] < $prev) {
                    $prev = $a['StdRate'];
                    $low = $k;
                }
            }
        }
        $lowUnits[$id] = array( $low => $array[$low]);
    }
    return $lowUnits;
}

$bigArray = array();
$bigArray[50][41788] = array('StdRate' => 231.0000, 'UnitName' => "NN23");
$bigArray[50][46238] = array('StdRate' => 303.0000, 'UnitName' => "1038");
$bigArray[50][46207] = array('StdRate' => 303.0000, 'UnitName' => "1007");
$bigArray[100][41570] = array('StdRate' => 299.0000, 'UnitName' => "HH18");
$bigArray[100][46214] = array('StdRate' => 388.0000, 'UnitName' => "1014");

$filtered = findLows($bigArray);

var_dump($filtered);

对于深度级别少1级的数组,可以使用
array\u filter()
直接迭代数据。由于要筛选与第一级条目相关的每组数据,因此只需将
array\u filter()
嵌套在
array\u map()
中(对于函数式脚本)

我将分离每个集合中的
StdRate
值,并通过对
array\u column()
生成的临时数组调用
min()
来确定最低值

要将
$min
值传递到筛选器的作用域中,请使用
use()

如果数据集中的最低值之间存在平局,则此代码段可能会为相应的数据集返回多个深子数组

代码:()

输出:

array (
  50 => 
  array (
    41788 => 
    array (
      'StdRate' => 231.0,
      'UnitName' => 'NN23',
    ),
  ),
  100 => 
  array (
    41570 => 
    array (
      'StdRate' => 299.0,
      'UnitName' => 'HH18',
    ),
  ),
)

有什么原因不能将所有这些元素放入一个数组(即值),然后使用
asort()
?最好的方法是基准测试。试着做你自己:)太棒了,我真的不需要排序。我只想删除除最低价单元之外的所有单元。我明白了……也许组合会有所帮助。制作一个函数,对单个单元执行
foreach
以消除除最低价格以外的所有价格,然后通过
array\u filter()
为您的大型阵列运行该函数。
$units = [
    50 => [
        41788 => ['StdRate' => 231.0000, 'UnitName' => "NN23"],
        46238 => ['StdRate' => 303.0000, 'UnitName' => "1038"],
        46207 => ['StdRate' => 303.0000, 'UnitName' => "1007"]
    ],
    100 => [
        41570 => ['StdRate' => 299.0000, 'UnitName' => "HH18"],
        46214 => ['StdRate' => 388.0000, 'UnitName' => "1014"]
    ]
];

var_export(
    array_map(
        function($unit) {
            $min = min(array_column($unit, 'StdRate'));
            return array_filter(
                $unit,
                function($row) use ($min) {
                    return $row['StdRate'] == $min;
                }
            );
        },
        $units
    )
);
array (
  50 => 
  array (
    41788 => 
    array (
      'StdRate' => 231.0,
      'UnitName' => 'NN23',
    ),
  ),
  100 => 
  array (
    41570 => 
    array (
      'StdRate' => 299.0,
      'UnitName' => 'HH18',
    ),
  ),
)