Php 获取数组列中的最小值和最大值

Php 获取数组列中的最小值和最大值,php,arrays,loops,max,minimum,Php,Arrays,Loops,Max,Minimum,我有一个以下格式的数组: $array = [ ['id' => 117, 'name' => 'Networking', 'count' => 16], ['id' => 188, 'name' => 'FTP', 'count' => 23], ['id' => 189, 'name' => 'Internet', 'count' => 48], ]; 是否有一种很好的方法来检索“count”列的最小值和最大值(

我有一个以下格式的数组:

$array = [
    ['id' => 117, 'name' => 'Networking', 'count' => 16],
    ['id' => 188, 'name' => 'FTP', 'count' => 23],
    ['id' => 189, 'name' => 'Internet', 'count' => 48],
];
是否有一种很好的方法来检索“count”列的最小值和最大值(
16
48


我可以使用几个循环来实现这一点,但我想知道是否有更好的方法。

您可以使用and函数。

您使用几个循环做了什么?一个就够了:)

  • 获取第一个元素,将计数分配到$min和$max
  • 迭代其余部分,将计数与每个$min和$max进行比较,如果较小/较大,则分配新的计数值

  • 与其他人发布的内容不同,您不能使用/函数解决此问题,因为这些函数不理解传入的数据结构(数组)。这些函数仅适用于标量数组元素


    开始编辑

    使用and似乎可以得出正确答案的原因与将数组类型转换为整数有关,这是一种:

    转换为整数的行为 未为其他类型定义。不要 依赖任何观察到的行为,因为它 可以不经通知而更改

    我上面关于类型转换的陈述是错误的。实际上,它可以和数组一起工作,但不是以OP需要的方式工作。使用多个数组或数组数组时,从左到右逐元素比较元素:

    $val = min(array(2, 4, 8), array(2, 5, 1)); // array(2, 4, 8)
    /*
     * first element compared to first element: 2 == 2
     * second element compared to second element: 4 < 5
     * first array is considered the min and is returned
     */
    

    看起来无法在2D数组上使用max()。它只返回最大的数组,而不是每个索引的max()

    因此:


    是否有与之相当的内置功能? (即使没有测试能力)

    /** *从二维数组中提取列,并在另一列上进行可选选择 * *@param$aArray要从中提取的数组 *@param$aColName要提取的列的名称,例如“O_name” *@param$aColTest(可选)要进行测试的列的名称,例如“O_ID” *@param$aTest(可选)测试字符串,例如“>=10”、““==”、“$toto.” *@return 1D数组,仅包含提取的列 *@access-public */ 函数extractColFromArray($aArray、$aColName、$aColTest=“”、$aTest=“”){ $mRes=array(); foreach($aArray作为$row){ if(($aColTest==“”)| |(eval(“return”。$row[$aColTest].$aTest.”)){ $mRes[]=$row[$aColName]; } } 返回$mRes; }//extractColFromArray
    如果所需列在数组中的第一个,则可以使用以下一行程序:

    $max = max(array_map('current', $a));
    $min = min(array_map('current', $a));
    

    这将发现<>强> ID

    < P>正如你从前面的答案中看到的,有很多可行的技术要考虑。

    如果您考虑的是最佳性能,那么应该尽量减少使用的循环数和函数调用数

    “在引擎盖下”,本机函数
    min()
    max()
    将完全迭代它们所馈送的数组。因此,如果您使用函数或构造在二维输入数组上循环,然后调用
    min()
    ,然后调用
    max()
    ,那么您将对输入数组的整个长度分别迭代三次

    考虑这个只迭代1次的代码段:

    代码:()

    • 上述方法的优点如下:
      • 只有1个临时变量
      • 它不会改变输入数组
      • 非常简洁、直观和声明式的编码风格
      • 如果其中一行缺少
        count
        元素,则不会生成任何警告
    • 上述方法的缺点是
      • 从技术上讲,它将数据迭代三次
      • 它的性能很可能比第一个代码段差

    +1我今天遇到了这个问题,我只是做了一个循环。好奇还有什么其他的方法。如果有一些函数可以做到这一点,它将通过循环实现,那么使用您自己的函数有什么不好@Svetlozar Angelov:对于PHP函数,循环将用C编写,而不是用PHP编写,因此它们通常更快数组(2、5、7)。阅读它。你的答案是正确的,尽管不是因为你所说的原因
    min
    max
    正确处理数组,并且不将它们转换为整数,手册提供了更多细节。@MitMaro:你是对的-我关于在min()和max()中使用数组的假设或推理是错误的。我编辑了我的答案并删除了错误的语句。作为“锡箔帽”参数,如果输入数组为空,此答案将返回错误的结果。当然,我不知道OP的应用程序是否可以传入一个空数组。这只是对研究人员的一个警告。这段代码在二维数组中找不到最小值和最大值。这不是这个问题的正确答案。这最多只是部分答案。为什么要为相同的返回值调用两次
    array\u map()
    ?这缺乏效率,也不是D.R.Y.这似乎解释得很好,但如果没有一个片段,研究人员可能无法按照你的意愿实施你的建议。你可以也可以不支持我答案中的第一个片段。如果你有不同的看法,也许可以在你的答案中添加一个片段,并解释为什么你会用自己独特的方式来做。
    $count = array();
    foreach($arr as $_arr) {
        $count[] = $_arr['count'];
    }
    var_dump(max($count), min($count));
    
    /** * extracts a column from a 2D array, with an optional selection over another column * * @param $aArray array to extract from * @param $aColName name of the column to extract, ex. 'O_NAME' * @param $aColTest (optional) name of the column to make the test on, ex. 'O_ID' * @param $aTest (optional) string for the test ex. ">= 10", "=='".$toto."'" * @return 1D array with only the extracted column * @access public */ function extractColFromArray($aArray, $aColName, $aColTest="", $aTest="") { $mRes = array(); foreach($aArray as $row) { if (($aColTest == "") || (eval("return " . $row[$aColTest] . $aTest . ";" )) ) { $mRes[] = $row[$aColName]; } } return $mRes; } // extractColFromArray
    $max = max(array_map('current', $a));
    $min = min(array_map('current', $a));
    
    $min = array_shift($array)['count'] ?? null;
    $max = $min;
    foreach ($array as $row) {
        if ($min > $row['count']) {
            $min = $row['count'];
        }
        if ($max < $row['count']) {
            $max = $row['count'];
        }
    }
    var_export(['min' => $min, 'max' => $max]);
    
    $counts = array_column($array, 'count');
    var_export(['min' => min($counts), 'max' => max($counts)]);