按最低价格过滤多维数组

时间:2013-11-22 17:12:19

标签: php multidimensional-array array-filter

我正在使用我想要过滤的数组,因此它只包含每个键的最低价格。所以50只有一个单位,相同的是100,那个单位将是最低的价格。

这是我正在使用的一个例子:

Array
(
    [50] => Array
        (
            [41788] => Array
                (
                    [StdRate] => 231.0000
                    [UnitName] => NN23
                )

            [46238] => Array
                (
                    [StdRate] => 303.0000
                    [UnitName] => 1038
                )

            [46207] => Array
                (
                    [StdRate] => 303.0000
                    [UnitName] => 1007
                )
        )
    [100] => Array
        (
            [41570] => Array
                (
                    [StdRate] => 299.0000
                    [UnitName] => HH18
                )

            [46214] => Array
                (
                    [StdRate] => 388.0000
                    [UnitName] => 1014
                )
        )
)

我想避免使用复杂的foreach循环来执行此操作,因此我认为array_filter会很好,但很难绕过它。或者foreach最好?

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

});

2 个答案:

答案 0 :(得分:1)

这是一个将通过您的多维数组并获取最低单位的函数。它将保留大阵列(50,100)的键和它所抓住的单元的键(41788,41570)。 不会保留相同低费率的多个值。在这些情况下,它将返回它找到的最低值的第一个。可能不是你想要的,但它应该是一个好的开始,你可以随时修改它。它使用嵌套的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);

将产生:

array(2) {
  [50]=>
  array(1) {
    [41788]=>
    array(2) {
      ["StdRate"]=>
      float(231)
      ["UnitName"]=>
      string(4) "NN23"
    }
  }
  [100]=>
  array(1) {
    [41570]=>
    array(2) {
      ["StdRate"]=>
      float(299)
      ["UnitName"]=>
      string(4) "HH18"
    }
  }
}

答案 1 :(得分:0)

对于深度减少 1 个级别的数组,您可以直接使用 array_filter() 迭代数据。因为您要过滤与第一级条目相关的每组数据,您只需将 array_filter() 嵌套在 array_map() 内(对于函数式脚本)。

我将隔离每个集合中的 StdRate 值,并通过对 min() 生成的临时数组调用 array_column() 来确定最小值。

要将 $min 值传递到过滤器的范围,请使用 use()

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

代码:(Demo)

$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',
    ),
  ),
)