PHP:按值长度排序数组

5
我想要将一个数组按照每个值中字符的长度进行排序(如果可能的话,对于长度相同的两个值,可以按照字母顺序排序)。例如:
Array ( [0] => this [1] => is [2] => a [3] => bunch [4] => of [5] => words;

I am trying to sort this array to look like:

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

怎么做?

5个回答

18
这应该就可以了:
array_multisort(array_map('strlen', $array), $array);
  • 通过使用array_map()映射strlen(),获取数组中每个字符串的长度
  • 按字符串长度对排序后的字符串数组进行排序,并使用array_multisort()对原始数组进行排序

聪明。我从来没有想过array_multisort - jcbwlkr

4

看起来其他人已经回答了,但我已经开始写了,所以我要发布它,该死的! :)

你可以查看usort

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

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

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

我使用三目运算符?:来返回字符串长度的差异,如果差异不为0。如果差异为0,则返回strcmp函数的返回值。


3
因为我了解PHP中的“Elvis运算符”,所以你会得到+1。 - Luis Masuelli

1

See this:

$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. criteria(a, b)>0且criteria(b, c)>0意味着criteria(a, c)>0。
  2. 对于小于号、小于或等于、大于或等于和等于,同样适用。
  3. criteria(a, b)的符号应与criteria(b, a)的符号相反。

1
您可以使用自定义排序函数来实现此功能。
function mycmp($a, $b) {
    $cmp = strlen($a) - strlen($b);
    if ($cmp === 0)
        $cmp = strcmp($a, $b);
    return $cmp;
}

usort($array, 'mycmp');

0

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