douyong1285
2013-07-12 11:42 阅读 21
已采纳

为什么asort适用于多维数组?

Apologies if this is a really basic question. I've inadvertently discovered that asort() appears to work with multidimensional arrays:

Sample PHP

$animals = array(
  1 => array('name' => 'Zebra'),
  2 => array('name' => 'Fox'),
  3 => array('name' => 'Rabbit'),
  4 => array('name' => 'Dog'),
  5 => array('name' => 'Cat')
);

asort($animals);
var_dump($animals);

Output

array
  5 => 
    array
      'name' => string 'Cat' (length=3)
  4 => 
    array
      'name' => string 'Dog' (length=3)
  2 => 
    array
      'name' => string 'Fox' (length=3)
  3 => 
    array
      'name' => string 'Rabbit' (length=6)
  1 => 
    array
      'name' => string 'Zebra' (length=5)

I'd like to know why this works?

I thought asort() only sorted flat arrays, and to sort multidimensional arrays you needed to define a custom sort function. I can't find anything in the documentation that explains the above behaviour.

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

3条回答 默认 最新

  • 已采纳
    doudouba4520 doudouba4520 2013-07-12 11:47

    Arrays are compared in the lexicographical order by their values, so an array where the first element is "cat" is less than an array where the first element is "zebra". This is just a normal single dimension sort that happens to compare arrays to each other.

    For example:

    php > var_dump(array('a')< array('b'));
    bool(true)
    php > var_dump(array('a')> array('b'));
    bool(false)
    
    点赞 评论 复制链接分享
  • du997562 du997562 2013-07-12 11:57

    This is the transcription of standard array comparison (in PHP)

    <?php
    // Arrays are compared like this with standard comparison operators
    function standard_array_compare($op1, $op2)
    {
        if (count($op1) < count($op2)) {
            return -1; // $op1 < $op2
        } elseif (count($op1) > count($op2)) {
            return 1; // $op1 > $op2
        }
        foreach ($op1 as $key => $val) {
            if (!array_key_exists($key, $op2)) {
                return null; // uncomparable
            } elseif ($val < $op2[$key]) {
                return -1;
            } elseif ($val > $op2[$key]) {
                return 1;
            }
        }
        return 0; // $op1 == $op2
    }
    ?>
    

    That's coherent with your case

    点赞 评论 复制链接分享
  • douhoushou8385 douhoushou8385 2013-07-12 12:11

    PHP compares array according to number of elements, for example: arrays with one element will be compared together, and will be sorted at top first, then, PHP looks for similar arrays (based on number of elements) then compare them with each other for sorting, and so on, for example:

    array(
    a => array(z),
    c => array(a,b),
    d => array(d,r,3,4),
    e => array(h,k,,p)
    }
    

    using asort, the result will be a => array(z) will be first element, because there is no other array with one element, therefore, it will be assigned at first place.

    array(
    c => array(x,b),
    e => array(h,k,,p)
    a => array(z),
    d => array(d,r,3,4),
    }
    
    点赞 评论 复制链接分享

相关推荐