对于如下数组:
$array = array(
735 => array('name'=>'Alpha', 'num'=>1),
584 => array('name'=>'Beta', 'num'=>4),
857 => array('name'=>'Gamma', 'num'=>1),
982 => array('name'=>'Delta', 'num'=>2)
);
过滤具有最小值num
的元素的最佳方法是什么。也就是说,在这种情况下,解决方案将是以下数组:
array(
735 => array('name'=>'Alpha', 'num'=>1),
857 => array('name'=>'Gamma', 'num'=>1)
);
我知道这可以通过foreach
循环完成并跟踪最小值,但我希望有一些数组函数可以完成这项工作。
我目前的做法是:
$num_values = array();
foreach($array as $id => $meta)
{
$num_values[] = $meta['num'];
}
$min_num_value = min($num_values);
$filtered_array = array();
foreach($array as $id => $meta)
{
if($meta['num'] == $min_num_value)
{
$filtered_array[$id] = $meta;
}
}
print_r($filtered_array);
,正如您所看到的,显然不是完成任务的最佳方式。
答案 0 :(得分:3)
优化的过滤版本,具有最小值计算和O(n)复杂度。
$array = array(
735 => array('name'=>'Alpha', 'num'=>1),
584 => array('name'=>'Beta', 'num'=>4),
857 => array('name'=>'Gamma', 'num'=>1),
982 => array('name'=>'Delta', 'num'=>2)
);
$minValue = PHP_INT_MAX;
$filteredArray = [];
foreach ($array as $key=>$data) {
$itemNumber = $data['num'];
if ($itemNumber < $minValue) {
$filteredArray = [$key => $data];
$minValue = $itemNumber;
} elseif ($itemNumber === $minValue) {
$filteredArray[$key] = $data;
}
}
var_dump($filteredArray);
foreach
的性能优于任何array_xxx()
函数以及闭包/函数的调用。因此,即使对于大型阵列,此解决方案也必须高效。
答案 1 :(得分:0)
由于min
只提供一条记录,您可以尝试这样做:它会删除第一个foreach
循环,其余的是您的。
$array = array(
735 => array('name'=>'Alpha', 'num'=>1),
584 => array('name'=>'Beta', 'num'=>4),
857 => array('name'=>'Gamma', 'num'=>1),
982 => array('name'=>'Delta', 'num'=>2)
);
$val = min($array);
$filtered_array=array();
foreach($array as $id => $meta)
{
if($meta['num'] == $val['num'])
{
$filtered_array[$id] = $meta;
}
}
print_r($filtered_array);
答案 2 :(得分:0)
这可能会对你有所帮助
$arr = array(
735 => array('name'=>'Alpha', 'num'=>1),
584 => array('name'=>'Beta', 'num'=>4),
857 => array('name'=>'Gamma', 'num'=>1),
982 => array('name'=>'Delta', 'num'=>2)
);
$inventory = array_map("array_values", $arr);
usort($inventory, function ($item1, $item2) {
if ($item1[1] == $item2[1]) return 0;
return $item1[1] < $item2[1] ? -1 : 1;
});
echo "<pre>";print_r($inventory);