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

为什么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.

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)

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

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),
}