【问题标题】:php: array sort by string keyphp:数组按字符串键排序
【发布时间】:2011-04-04 06:58:36
【问题描述】:

如何通过键对这样的数组进行排序,从较小的分辨率到较大的分辨率:

$sizes = array(
   '120x120' => 'large',
   '60x60' => 'small',
   '200x200' => 'very large',
   '90x90' => 'medium',
...

?

应该是:

  • 60x60
  • 90x90
  • 120x120
  • 200x200
  • ...

【问题讨论】:

    标签: php arrays sorting


    【解决方案1】:

    ksort() 在数字模式下应该可以正常工作:

    $sizes = array(
       '120x120' => 'large',
       '60x60' => 'small',
       '200x200' => 'very large',
       '90x90' => 'medium',
    );
    
    ksort($sizes, SORT_NUMERIC);
    var_dump($sizes);
    

    会得到你:

    array
      '60x60' => string 'small' (length=5)
      '90x90' => string 'medium' (length=6)
      '120x120' => string 'large' (length=5)
      '200x200' => string 'very large' (length=10)
    


    这将起作用,因为大小是数字 - 并且在 'x' 之前找到(不确定'x' 将做什么以及接下来的内容 - 但是,无论如何,这部分键是无用的,因为它纯粹是多余的信息)

    【讨论】:

    • 谢谢,我不认为按数字排序会起作用,因为我有一个x :)
    • @Alexandra PHP 将在“数字”命中“x”时有效地截断它。因此,您实际上只对第一个数字进行排序。
    • 这不起作用,因为它将作为字符串排序,因此 12 会在 6 之前,因为它以 1 开头,对吧?
    【解决方案2】:

    你需要自然的按键排序,可以使用uksort

    uksort($array, 'strnatcasecmp');
    

    【讨论】:

    • 我相信这是一个更好的答案,也更通用。这将正确排序“120x120”、“120x90”,而数字键排序则不会。
    【解决方案3】:
    $sizes = array(
       '120x120' => 'large',
       '60x60' => 'small',
       '200x200' => 'very large',
       '90x90' => 'medium');
    uksort($sizes, 'userSorting');
    print_r($sizes);
    function userSorting($a, $b) {
        $a = explode('x', $a);
        $b = explode('x', $b);
        return $a[0] > $b[0];
    }
    

    【讨论】:

      【解决方案4】:

      试试ksort()

      按key对数组进行排序,维护key 到数据相关性。这很有用 主要用于关联数组。

      编辑:要使答案完整,请使用SORT_NUMERIC 标志。

      【讨论】:

      • -1 那不起作用尝试理解问题输出[120x120] => large [200x200] => very large [60x60] => small [90x90] => medium
      • 这些是字符串,不会像整数一样排序
      【解决方案5】:

      如果您查看 PHP 的 Sorting Arrays 手册页,您会看到有几个选项可以根据其键对数组进行排序,其中 ksort(使用 SORT_NUMERIC 修饰符)很可能是你所追求的。

      【讨论】:

      • @Alexandra Apologies - 您需要使用 SORT_NUMERIC 修饰符来进行 ksort。 @Pascal 的出色回答完美地说明了这一点。 :-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-29
      • 2018-04-20
      相关资源
      最近更新 更多