Php 不使用foreach比较关联数组值的有效方法

Php 不使用foreach比较关联数组值的有效方法,php,arrays,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) ); 过滤最小值为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)
);
过滤最小值为
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);

正如您所见,这显然不是执行任务的最佳方式。

因为
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);

由于
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);

这可能对你有帮助

$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);
$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\u map(“array\u value”,$arr);
usort($inventory,function($item1,$item2){
如果($item1[1]==$item2[1])返回0;
返回$item1[1]<$item2[1]?-1:1;
});
回声“;打印(库存);

这可能会对您有所帮助

$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);
$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\u map(“array\u value”,$arr);
usort($inventory,function($item1,$item2){
如果($item1[1]==$item2[1])返回0;
返回$item1[1]<$item2[1]?-1:1;
});
回声“;打印(库存);

优化版过滤,具有最小值计算和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\u INT\u MAX;
$filteredArray=[];
foreach($key=>$data的数组){
$itemNumber=$data['num'];
如果($itemNumber<$minValue){
$filteredArray=[$key=>$data];
$minValue=$itemNumber;
}elseif($itemNumber===$minValue){
$filteredArray[$key]=$data;
}
}
变量转储($filteredArray);

foreach
的性能优于任何
array_xxx()
函数加上闭包/函数调用。因此,即使对于大型阵列,此解决方案也必须是有效的。

具有最小值计算和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\u INT\u MAX;
$filteredArray=[];
foreach($key=>$data的数组){
$itemNumber=$data['num'];
如果($itemNumber<$minValue){
$filteredArray=[$key=>$data];
$minValue=$itemNumber;
}elseif($itemNumber===$minValue){
$filteredArray[$key]=$data;
}
}
变量转储($filteredArray);

foreach
的性能优于任何
array_xxx()
函数加上闭包/函数调用。因此,即使对于大型阵列,此解决方案也必须是有效的。

min($array)
-它的索引值最低,即584。。而我想要的最小值是
num
min($array)
——它取的是最低的索引值,即584。。鉴于我需要
num
Downvoter的最小值,是否需要解释?Downvoter,是否需要解释?确认。Microbenchmark向我展示了大型(500万行)数据集约50%的提升(与两个循环相比)。我看到了我以前从未见过的东西
[$key=>$data]
。这是PHP7语法吗?短数组语法,从PHP5.4Confirm开始提供。Microbenchmark向我展示了大型(500万行)数据集约50%的提升(与两个循环相比)。我看到了我以前从未见过的东西
[$key=>$data]
。这是PHP7语法吗?短数组语法,从PHP5.4开始提供