2013-07-12 2 views
5

Извините, если это действительно основной вопрос. Я случайно обнаружил, что asort() появляется для работы с многомерными массивами:Почему асорт работает с многомерными массивами?

Пример 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); 

Выход

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) 

Я хотел бы знать, почему это работает?

Я думал, что asort() только отсортированные плоские массивы и сортировать многомерные массивы, необходимые для определения пользовательской функции сортировки. Я не могу найти ничего в документации, которая объясняет описанное выше поведение.

+0

Это простой многомерный массив, попробуйте с большим. array_multisort для многомерных массивов – exussum

+1

@ user1281385: 1. В php 2 нет «простых» или «не простых» массивов. 'array_multisort' не для многомерных массивов – zerkms

+0

Вы уверены? http://codepad.org/TC63qGFF Он также работает с простым массивом. – swapnesh

ответ

7

Массивы сравниваются в лексикографическом порядке по их значениям, поэтому массив, в котором первый элемент является «cat», меньше массива, где первым элементом является «зебра». Это просто обычная одномерная сортировка, которая позволяет сравнивать массивы друг с другом.

Например:

php > var_dump(array('a')< array('b')); 
bool(true) 
php > var_dump(array('a')> array('b')); 
bool(false) 
+3

Хм, любая ссылка для этого? – zerkms

+2

Нашел это http://php.net/manual/en/language.operators.comparison.php - ctrl-f для «Транскрипция сравнения стандартных массивов» – zerkms

+1

Действительно, 'Array с меньшим количеством членов меньше, если в операнде 2 не найден ключ из операнда 1, тогда массивы несравнимы, в противном случае - сравнивают значение по значению (см. следующий пример) '. С другой стороны, найти реальный сценарий для использования такой функции - совсем другая история. –

3

Это транскрипция standard array comparison (в 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 
} 
?> 

Это согласуется с вашим случае

0

PHP сравнивает массив в зависимости от количества элементов, Например: массивы с одним элементом будут сравниваться вместе и будут отсортированы сначала вверх, затем PHP ищет аналогичные массивы (основанные на количестве элементов), тогда comp являемся их друг с другом для сортировки, и так далее, например:

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

использования asort, результат будет a => array(z) будет первым элементом, потому что нет никакого другого массива с одним элементом, таким образом, он будет быть назначенным на первое место.

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