PHP:按照值的长度对数组进行排序?

Sam*_*152 58 php arrays

我做了一个anagram机器,我有一系列积极的比赛.问题是它们都处于不同的顺序,我希望能够对数组进行排序,以便首先显示最长的数组值.

有人对如何做到这一点有任何想法吗?

Unk*_*own 142

使用http://us2.php.net/manual/en/function.usort.php

使用此自定义功能

function sort($a,$b){
    return strlen($b)-strlen($a);
}

usort($array,'sort');
Run Code Online (Sandbox Code Playgroud)

如果你想保留旧索引,请使用uasort,如果你不关心,请使用usort.

另外,我相信我的版本更好,因为usort是一种不稳定的类型.

$array = array("bbbbb", "dog", "cat", "aaa", "aaaa");
// mine
[0] => bbbbb
[1] => aaaa
[2] => aaa
[3] => cat
[4] => dog

// others
[0] => bbbbb
[1] => aaaa
[2] => dog
[3] => aaa
[4] => cat
Run Code Online (Sandbox Code Playgroud)

  • 这很好,虽然我不会把这个功能称为'排序'.下面的sortByLength更具描述性. (13认同)
  • 对所有人 - 记住关于mb_strlen() - 并非所有lang都相同 (6认同)
  • 不将其命名为“排序”_is_ 重要,不是因为描述性,而是因为致命错误:无法重新声明排序。 (2认同)
  • 为什么不使用mb_strlen而不是strlen?虽然比strlen慢,但一旦出现多字节值,就可以防止头痛. (2认同)

xlt*_*ttj 61

如果你想以PHP 5.3的方式做到这一点,你可能想要创建这样的东西:

usort($array, function($a, $b) {
    return strlen($b) - strlen($a);
});
Run Code Online (Sandbox Code Playgroud)

这样您就不会污染全局命名空间.

但只有在源代码中的单个位置需要它才能保持干燥时才这样做.


小智 31

PHP7即将到来.在PHP7中,您可以使用Spaceship Operator.

usort($array, function($a, $b) {
    return strlen($b) <=> strlen($a);
});
Run Code Online (Sandbox Code Playgroud)

希望这可以在将来帮助你.

  • 有趣,不知道有这个。我想知道仅使用减法是否有任何性能优势,而不是像 @clttj 建议的那样。 (2认同)

zal*_*lew 10

function sortByLength($a,$b){
  if($a == $b) return 0;
  return (strlen($a) > strlen($b) ? -1 : 1);
}
usort($array,'sortByLength');
Run Code Online (Sandbox Code Playgroud)

  • 这有一个错误.你的平等条件太窄了.字符串"abc"和"def"应该从这种类型返回0,但不会.他们将返回1.而我意识到这不是一个严重的错误(输出不会*看起来*破坏,它在技术上是不准确的. (2认同)
  • 'if($a == $b) 返回 0;' 这是个错误。我们在谈论长度。 (2认同)

小智 5

降序排列:

$array = ['aa', 'bb', 'c', 'ccc', 'a', 'ertre'];

usort($array, function($a, $b){
   return strlen($a) < strlen($b);
});

var_export($array);

// Output
array (
  0 => 'ertre',
  1 => 'ccc',
  2 => 'aa',
  3 => 'bb',
  4 => 'c',
  5 => 'a',
)

Run Code Online (Sandbox Code Playgroud)

升序:

$array = ['aa', 'bb', 'c', 'ccc', 'a', 'ertre'];

usort($array, function($a, $b){
   return strlen($a) > strlen($b);
});

// Output
array (
  0 => 'c',
  1 => 'a',
  2 => 'aa',
  3 => 'bb',
  4 => 'ccc',
  5 => 'ertre',
)
Run Code Online (Sandbox Code Playgroud)