【问题标题】:PHP find second highest element value in a multidimensional arrayPHP在多维数组中找到第二高的元素值
【发布时间】:2014-09-18 19:43:56
【问题描述】:

如何获得多维数组中第二高的元素值。 我使用这个函数来获得最高值。但是我怎样才能找到第二高的。

function get_max($array)
{
    $max = -999999999;
    $found_item = null;

    foreach ($array as $key => $value) {
        if ($value['transaction_no'] > $max) {
           $max = $value['transaction_no'];
           $found_item = $value;
        }
    }

    return $found_item;
}

例如,如果我调用get_max($transactions),我会得到数组编号 4,因为它在 transaction_no 中具有最高值:5。但是我怎样才能获得第二高呢?例如,当我调用get_second_max($transactions) 时,我应该得到数组编号 3,因为它在 transaction_no 中有 4。

$transactions = Array
    (
        [0] => Array
            (
                [transaction_user_id] => 359691e27b23f8ef3f8e1c50315cd506
                [transaction_no] => 1
                [transaction_total_amount] => 589.00
                [transaction_date] => 1335932419
                [transaction_status] => cancelled
            )

        [1] => Array
            (
                [transaction_user_id] => 9def02e6337b888d6dbe5617a172c18d
                [transaction_no] => 2
                [transaction_total_amount] => 79.00
                [transaction_date] => 1336476696
                [transaction_status] => cancelled
            )

        [2] => Array
            (
                [transaction_user_id] => 9def02e6337b888d6dbe5617a172c18d
                [transaction_no] => 3
                [transaction_total_amount] => 299.00
                [transaction_date] => 1336476739
                [transaction_status] => cancelled
            )

        [3] => Array
            (
                [transaction_user_id] => 9def02e6337b888d6dbe5617a172c18d
                [transaction_no] => 4
                [transaction_total_amount] => 79.00
                [transaction_date] => 1336476927
                [transaction_status] => cancelled
            )

        [4] => Array
            (
                [transaction_user_id] => 8e9050a3646c98342b9ba079fba80982
                [transaction_no] => 5
                [transaction_total_amount] => 129.00
                [transaction_date] => 1336477032
                [transaction_status] => cancelled
            )

    )

【问题讨论】:

  • 按照交易号对数组进行排序,然后得到数组的第二个元素。
  • 如果您从 SQL 查询中获取此项目 - 然后在使用 order bylimit 的查询中找到结果

标签: php arrays


【解决方案1】:

当找到大于当前最大值的值时,您知道当前最大值是迄今为止的第二大值。或者,如果发现小于或等于当前最大值但大于当前第二大值的较大值,则相应地更新当前第二大值。

更新代码:

function get_max($array) {
    $max = -999999999;
    $max_item = null;
    $second_max_item = null;
    foreach($array as $key=>$value)
    {
        if($value['transaction_no'] >= $max)
        {
            $max = $value['transaction_no'];
            $second_max_item = $max_item;
            $max_item = $value;

        } else if($value['transaction_no'] > $second_max_item['transaction_no']) {

            $second_max_item = $value;

        }
     }

    return $second_max_item;
}

【讨论】:

    【解决方案2】:
    <?php
    function get_max($array) {
    
        $all = array();
        foreach($array as $key=>$value){
            $all[] = $value['transaction_no'];
        }
    
        rsort($all);
        return $all[1];
    }
    

    要返回数组而不仅仅是值:

    function get_max($array) {
    
        $all = array();
        foreach($array as $key=>$value){
            /* creating array where the key is transaction_no and
               the value is the array containing this transaction_no */
            $all[$value['transaction_no']] = $value;
        }
    
        /* now sort the array by the key (transaction_no) */
        krsort($all);
    
        /* get the second array and return it (see the link below) */
        return array_slice($all, 1, 1)[0];
    }
    

    PHP: Get n-th item of an associative array

    【讨论】:

    • asort 返回bool
    • 要么按降序排序,要么返回$all[count($all) - 2]
    • 这将返回第二高的值,但我如何获得该元素的数组
    • @wumm 我的问题是获取 transaction_no 中第二高值的整个元素,而不仅仅是值
    • 嘿@wumm,感谢更新,更新中有一些小的打字错误,但非常感谢,我会接受这个作为正确答案
    【解决方案3】:

    出于测试目的,您给定的数组

    $transactions = array(
        array(
            'transaction_user_id'       => '359691e27b23f8ef3f8e1c50315cd506',
            'transaction_no'            => 1,
            'transaction_total_amount'  => 589.00,
            'transaction_date'          => 1335932419,
            'transaction_status'        => 'cancelled',
        ),
        array(
            'transaction_user_id'       => '9def02e6337b888d6dbe5617a172c18d',
            'transaction_no'            => 2,
            'transaction_total_amount'  => 79.00,
            'transaction_date'          => 1336476696,
            'transaction_status'        => 'cancelled',
        ),
        array(
            'transaction_user_id'       => '9def02e6337b888d6dbe5617a172c18d',
            'transaction_no'            => 3,
            'transaction_total_amount'  => 299.00,
            'transaction_date'          => 1336476739,
            'transaction_status'        => 'cancelled',
        ),
        array(
            'transaction_user_id'       => '9def02e6337b888d6dbe5617a172c18d',
            'transaction_no'            => 4,
            'transaction_total_amount'  => 79.00,
            'transaction_date'          => 1336476927,
            'transaction_status'        => 'cancelled',
        ),
        array(
            'transaction_user_id'       => '8e9050a3646c98342b9ba079fba80982',
            'transaction_no'            => 5,
            'transaction_total_amount'  => 129.00,
            'transaction_date'          => 1336477032,
            'transaction_status'        => 'cancelled',
        ),
    );
    

    获取最大交易数的第 n 个祖先的简单函数。

    它使用您想要的祖先的事务和索引检索您的数组。在内部,它检查您的数组是否足够大以获取定义的祖先,按事务编号对给定数组进行排序并返回第 n 个(祖先)元素。

    function getTransactionMaxAncestor($transactions, $ancestor = 0)
    {
        if ($ancestor > count($transactions)) {
            throw new Exception('Not enough transactions available');
        }   
    
        usort($transactions, function ($a, $b) {
            $ta = $a['transaction_no'];
            $tb = $b['transaction_no'];
    
            if ($a == $b) {
                return 0;
            }
    
            return $a > $b ? -1 : 1;
        });
    
        return $transactions[$ancestor];
    }
    

    获取第二高元素的相关调用

    $secondHighest = getTransactionMaxAncestor($transactions, 1);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-25
      • 1970-01-01
      • 2021-12-28
      • 2017-04-11
      相关资源
      最近更新 更多