我正在使用我想要过滤的数组,因此它只包含每个键的最低价格。所以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) {
});
答案 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',
),
),
)