Why does asort work with multidimensional arrays?

2020-07-15 01:33发布

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.

标签: php sorting
3条回答
爱情/是我丢掉的垃圾
2楼-- · 2020-07-15 01:57

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),
}
查看更多
一夜七次
3楼-- · 2020-07-15 01:58

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

查看更多
乱世女痞
4楼-- · 2020-07-15 02:02

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)
查看更多
登录 后发表回答