PHP:按值长度排序数组

时间:2014-07-21 21:04:29

标签: php arrays sorting

我正在尝试按每个值中的字符长度对数组进行排序(如果可能的话,如果两个值具有相同的字符长度,则可能按字母顺序排序)。例如:

Array ( [0] => this [1] => is [2] => a [3] => bunch [4] => of [5] => words;

我正在尝试将此数组排序为:

Array ( [0] => a [1] => is [2] => of [3] => this [4] => bunch [5] => words;

如何?

5 个答案:

答案 0 :(得分:11)

这应该这样做:

array_multisort(array_map('strlen', $array), $array);
  • 使用strlen()
  • 映射array_map(),获取数组中每个字符串的长度
  • 对字符串长度进行排序,并使用array_multisort()
  • 按字符串长度排序数组对原始数组进行排序

答案 1 :(得分:2)

看起来其他人已经回答了但是我开始写这篇文章所以我要发布它,当然! :)

您可以查看usort

$data = ["this", "is", "a", "bunch", "of", "words"];

usort($data, function($a, $b) {
    $difference =  strlen($a) - strlen($b);

    return $difference ?: strcmp($a, $b);
});

我正在使用Elvis运算符?:根据字符串长度返回差值,如果它不是0.如果它是0,则只返回strcmp的返回值

答案 2 :(得分:1)

见:

$myarray = explode(" ", "this is a bunch of words");
usort($myarray, function($a, $b) { return strlen($a) - strlen($b) });
print_r($array);

说明:usort在给定自定义比较器的情况下,对阵列(即通过引用)进行排序。如果第一项应该在第二项之前,则比较器必须返回负数,否则返回正数。值为0表示它们在订单上是相同的。

当长度相同时,您可以添加与strlen()无关的自定义条件。这取决于您,并且仅涉及额外的if块。

重要的是要注意该函数必须定义一个订单关系,如数学所示:

  1. 标准(a,b)> 0和标准(b,c)> 0意味着标准(a,c)> 0。
  2. 相同的适用于低于标志,低于或等于,大于或等于,等于。
  3. 标准(a,b)应具有相反的标准符号(b,a)。

答案 3 :(得分:1)

您可以使用自定义排序功能。

function mycmp($a, $b) {
    $cmp = strlen($a) - strlen($b);
    if ($cmp === 0)
        $cmp = strcmp($a, $b);
    return $cmp;
}

usort($array, 'mycmp');

答案 4 :(得分:0)

另一种方法:

$f = fn($s1, $s2) => strlen($s1) <=> strlen($s2);
usort($a, $f);

https://php.net/language.operators.comparison