2014-11-13 2 views
2

Если я использую массив и обратный вызов возвращает 0, элементы меняются на противоположные.Если обратный вызов uasort возвращает 0, элементы меняются на противоположные.

<?php 

$a = array("1", "2", "3"); 

print_r($a); 

function nosort($a, $b){ 
    return 0; 
} 

uasort($a, "nosort"); 

print_r($a); 

Результаты в:

Array 
(
    [0] => 1 
    [1] => 2 
    [2] => 3 
) 
Array 
(
    [2] => 3 
    [1] => 2 
    [0] => 1 
) 

Почему это происходит? Не было бы 0 не переключающих элементов более нормальным по умолчанию?

+0

Использование '1' будет сохранять свою позицию: https://eval.in/220979 –

+0

Это больше вопрос, почему не использует 0, чтобы сохранить свою позицию? Кажется, что это будет нормальный по умолчанию –

+0

А, да, это имеет больше смысла для вопроса. Я всегда считал, что '1' - индекс элемента увеличения,' 0', тот же, '-1' уменьшает индекс элемента. (+1 как заинтересовало) –

ответ

2

Из документации uasort:

Примечание
Если два члена сравниваются как равные, их относительный порядок в отсортированном массиве не определен.

Вы определили все записи в массиве как имеющие равные сравнения, чтобы PHP мог делать все, что с ними похоже. Тот факт, что он вышел в обратном порядке, может быть просто совпадением.
Вы не должны, при любых обстоятельствах, зависят от этого поведения, так как оно не определено.

+0

Это не случайно! Он всегда меняет массив ???? –

+1

И будущая версия PHP, если бы она изменила базовый алгоритм сортировки, может и не быть. Это побочный продукт, на который вы должны * не * рассчитывать. Количество восклицательных знаков не изменится. –

0

uasort()нет стабильный вид - то есть нет гарантии, что два равных элемента (те, для которых сравнение возвращает 0) сохранят свой порядок. Они могут, они не могут. Тот факт, что они, оказывается, меняются на противоположные, - это не то, на что вы должны рассчитывать.

Документы uasort() содержат an example стабильного варианта на uasort(), если вам это нужно.

Смежные вопросы