在不使用foreach的情况下比较关联数组值的有效方法

时间:2017-01-05 06:36:57

标签: php arrays

对于如下数组:

$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);

,正如您所看到的,显然不是完成任务的最佳方式。

3 个答案:

答案 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);