PHP关联数组排序并获取键名最长的键

3

嘿,我有一个关联数组,其中键为字符串,值为整数。

所以我需要从这个关联数组中获取具有最高值的键,如果有多个键具有相同的值,则需要选择长度最长的键。

那么,最有效的方法是什么呢?

示例:

array = (
    'abc'     => 10,
    'def'     => 8,
    'fff'     => 3,
    'abcr'    => 10,
    'adsfefs' => 10
)

所以我应该得到输出为adsfefs。

你能提供一个例子吗? - Niklesh Raut
3个回答

6

您可以使用array_keys函数,并传递第二个参数来过滤只包含max的键。然后,您可以使用array_reduce和一个检查字符串长度并且抛弃最短字符串的函数来找到最长的键,代码如下:

$array = array(
    'abc'     => 10,
    'def'     => 8,
    'fff'     => 3,
    'abcr'    => 10,
    'adsfefs' => 10
);

$keys = array_keys($array, max($array));
$longestKey = array_reduce($keys, function ($a, $b) { return strlen($a) > strlen($b) ? $a : $b; });

var_dump($longestKey);

请注意,如果有两个或更多长度相同的字符串,则会返回最后一个字符串。

我现在意识到max()函数适用于字符串数组,所以整个代码中的两行可以被简化为$longestKey = max(array_keys($array, max($array))); - Dan Abrey

0
使用arsort(array)按值进行反向排序。 对于结果数组,只要值不变,就循环存储每个键在其他数组中的格式。
[key] => strlen(key);
然后使用arsort(other_array),取第一个元素。它应该是具有最长键的元素(但要注意,如果有许多键具有相同的长度,则应添加一些其他条件以在它们之间选择)。
以下是示例代码:
<?php

$sid = array(
    'abc'     => 10,
    'def'     => 8,
    'fff'     => 3,
    'abcr'    => 10,
    'adsfefs' => 10
);

arsort($sid);

$prev_val = null;
$keys = Array();

foreach ($sid as $k=>$v) {
    if ($k < $prev_val) break;
    $keys[$k] = strlen($k);
    $prev_val = $k;
}

arsort($keys);

echo "具有最高价值的最长键是:" . array_keys($keys)[0] . "\n";
?>

0
使用arsort($data);对值数据进行初始排序,然后使用array_values来识别最大值。通过最大值找到具有此值的键,然后迭代并找到最长的键值。
$data = array('bob' => 3, 'rob' => 4, 'nigel' => 6,'john' => 6, 'tony' => 6 );

// Sort array in descending value order
arsort($data);

// Get the first value (will be the largest value)
$maxValue = array_values($data)[0];

// Get an array of all keys with this value
$keys = array_keys($data, $maxValue);

// Find longest key
$maxKey = '';
foreach ($keys as $key) {
    if (strlen($key) > strlen($maxKey)) {
        $maxKey = $key;
    }
}

// Output
print "Largest Value = $maxValue\n";
print "Largest Key with value of $maxValue is $maxKey\n";

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接