【问题标题】:Get the maximum value from an element in a multidimensional array?从多维数组中的元素中获取最大值?
【发布时间】:2010-02-03 03:26:57
【问题描述】:

我正在尝试为多维数组中的特定键选择最大值。我在“获取”问题的关键时遇到了麻烦......

所以,数组(比我在这里发布的要长得多)

[0] => stdClass Object
    (
        [id] => 70
        [cust] => 4
        [dnum] => 1
        [upper] => Array
            (
                [0] => 66
            )

    )
[1] => stdClass Object
    (
        [id] => 43
        [cust] => 42
        [dnum] => 2
        [upper] => Array
            (
                [0] => 77
            )

    )
[2] => stdClass Object
    (
        [id] => 12
        [cust] => 3
        [dnum] => 0
        [upper] => Array
            (
                [0] => 99
            )

    )

我试图在整个数组中找到最大的“dnum”值,所以在这个例子中,$max = 2。我知道 max 函数允许我这样做,但我不知道如何引用 dnum 元素而不将整个内容放在 foreach 循环中,如果我这样做,那么 max 将不是要使用的函数,对吗?

所以,我不能完全这样做:

$max = max($myarray[]->dnum);

有没有办法让我在不必重新创建整个数组的情况下做到这一点?

【问题讨论】:

  • @Felix Kling:你为什么要进行这样的MINOR编辑并重新激活这个问题?
  • @Pranav:清理....标签不属于标题。

标签: php arrays max multidimensional-array


【解决方案1】:

在 PHP 5.2 中,唯一的方法是遍历数组。

$max = null;
foreach ($arr as $item) {
  $max = $max === null ? $item->dnum : max($max, $item->dnum);
}

注意:我已将结果设为 0,因为如果所有 dnum 值都是负数,那么现在接受的解决方案将产生不正确的结果。你需要用一些明智的东西来播种最大值。

您也可以使用array_reduce():

$max = array_reduce($arr, 'max_dnum', -9999999);

function max_denum($v, $w) {
  return max($v, $w->dnum);
}

在 PHP 5.3+ 中,您可以使用匿名函数:

$max = array_reduce($arr, function($v, $w) {
  return max($v, $w->dnum);
}, -9999999);

你也可以使用array_map()

function get_dnum($a) {
  return $a->dnum;
}

$max = max(array_map('get_dnum', $arr));

【讨论】:

  • 该死的你和你对替代语法的使用! (开玩笑)
  • 感谢您提供不同的选项!我相信array_map 会反其道而行之(relevant doc)所以最后的解决方案应该是$max = max(array_map('get_dnum', $arr));
【解决方案2】:
$max = 0;
foreach($array as $obj)
{
    if($obj->dnum > $max)
    {
        $max = $obj->dnum;
    }
}

如果您的最大数字不是负数(负数、空数组和 0 将返回最大值为 0),该函数将正常工作。

因为您使用的是可以具有自定义属性/结构的对象,所以我不相信您可以使用任何“预定义”函数来获取它。还不如只使用一个 foreach 循环。

你真的无法摆脱 foreach 循环,因为即使是内部函数也使用 foreach 循环,它只是在幕后。

另一种解决方案是

$numbers = array();
foreach($array as $obj)
{
    $numbers[] = $obj->dnum;
}
$max = max($numbers);

【讨论】:

    【解决方案3】:

    最简单的方法可能是您最初的想法,即将您的数组循环一次,然后将所有dnum 键拉出到一个单独的数组中,然后调用max()

    $out = array();
    foreach($myarray as $obj) {
        $out[] = $obj->dnum;
    }
    echo max($out);
    

    您可以在不创建单独数组的情况下执行此操作,但您最终会更频繁地调用max()。两者之间的性能/内存使用情况会有所不同,您可以随时对其进行基准测试:

    $first = $myarray[0];  //assume zero start index
    $max = $first->dnum;
    foreach($myarray as $obj) {
        $max = max($max,$obj->dnum);
    }
    echo $max;
    

    您可以解决的唯一其他方法是使用usort() 和基于对象dnum 属性的自定义排序函数对数组进行排序。但是,这可能会比仅循环数组要慢得多,因此除非您需要将数组排序为副作用,否则我认为我不会推荐它。

    【讨论】:

      【解决方案4】:

      如果你喜欢oneliners

      $max = max( array_map(function( $row ){ return $row->dnum; }, $myarray) );
      

      【讨论】:

        【解决方案5】:

        对于仍然感兴趣的人,试试这个...

         $min = min(array_column($myarray, 'dnum'));
         $max = max(array_column($myarray, 'dnum'));
        

        【讨论】:

          猜你喜欢
          • 2017-11-03
          • 1970-01-01
          • 2015-04-22
          • 1970-01-01
          • 2014-05-22
          • 1970-01-01
          • 1970-01-01
          • 2021-07-30
          • 2017-10-16
          相关资源
          最近更新 更多