PHP在多维数组中查找第二高的元素值

PHP在多维数组中查找第二高的元素值,php,arrays,Php,Arrays,如何获得多维数组中第二高的元素值。 我使用这个函数来获得最高值。但是我怎么才能找到第二高的呢 function get_max($array) { $max = -999999999; $found_item = null; foreach ($array as $key => $value) { if ($value['transaction_no'] > $max) { $max = $value['transact

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

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\u max($transactions)
我会得到数组号4,因为它在事务号中的值最高:5。但是我怎样才能得到第二高呢?例如,当我调用
get\u second\u max($transactions)
时,我应该得到数组编号3,因为它在事务编号中有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
            )

    )

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

更新代码:

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;
}

为了测试您给定的阵列

$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个(祖先th)元素

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

$secondHighest = getTransactionMaxAncestor($transactions, 1);

按事务编号对数组进行排序,然后获取数组的第二个元素。如果您从SQL查询中获取此项,则可以在查询中使用
order by
limit
asort
返回
bool
按降序排序或返回
$all[count($all)-2]
这将返回第二高的值,但如何获取该值的数组element@wumm我的问题是获取事务中第二高值的整个元素。\u不,不仅仅是值Hey@wumm,感谢更新,更新中有一些小的键入错误,但是非常感谢,我将接受这一正确答案
$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',
    ),
);
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);