Почему сортировка не удалась? - PullRequest
7 голосов
/ 18 марта 2011

Я пишу библиотечную процедуру, которая, помимо прочего, будет выполнять довольно сложную сортировку вложенных массивов.

Я вижу из документации, что все функции сортировки массивов (включая те, которые используют встроенные компараторы) могут возвращать false при сбое - но когда это когда-нибудь произойдет ???

Ответы [ 4 ]

10 голосов
/ 18 марта 2011

Сбой при отправке переменной в функцию НЕ массив
Пример:

asort('Hello');//fails
asort(array(1,2,35,7,2,8,3));//true
2 голосов
/ 17 июля 2018

Я также наткнулся на этот вопрос и провел некоторое исследование, если есть другие условия, когда sort возвращает false.Просмотр кода показал, что эта сортировка функция

PHP_FUNCTION(sort)
{
    zval *array;
    zend_long sort_type = PHP_SORT_REGULAR;
    compare_func_t cmp;

    ZEND_PARSE_PARAMETERS_START(1, 2)
        Z_PARAM_ARRAY_EX(array, 0, 1)
        Z_PARAM_OPTIONAL
        Z_PARAM_LONG(sort_type)
    ZEND_PARSE_PARAMETERS_END_EX(RETURN_FALSE);

    cmp = php_get_data_compare_func(sort_type, 0);

    if (zend_hash_sort(Z_ARRVAL_P(array), cmp, 1) == FAILURE) {
        RETURN_FALSE;
    }
    RETURN_TRUE;
}

В первом представлении вы видите, что функция сортировки возвращает false только в случае сбоя zend_hash_sort.zend_hash_sort - это макрос, который на самом деле вызывает zend_hash_sort_ex.Эта функция была довольно надежной и возвращает SUCCESS в во всех случаях - даже если вы передаете массивы с абсолютно несопоставимыми элементами.

Это возвращает нас к функции сортировки, которая выполняет проверку некоторых параметровмакросов и имеет три правила.

  1. Функция принимает как минимум один аргумент и максимум 2 аргумента.

  2. Первый аргумент должен быть массивом

  3. Второй аргумент (если указан) должен быть длинным

Так что sort возвращает только false в случае, если один из этих трехправила нарушены.

$a = false;
sort($a); // fails because of rule 2
$a = [];
sort($a, "test"); // failes because of rule 3
sort($a, 0, "test"); // failes because of rule 1
2 голосов
/ 18 марта 2011

Когда предоставленный параметр не является массивом (или, может быть, даже просто пустым массивом).

0 голосов
/ 18 марта 2011

примеры возврата false могут включать в себя пустой массив, переменную, а не массив, недостаточно памяти, сбой вызова библиотеки, сбой во время выполнения модуля сортировки, параметры вызова недопустимы, пакет диска или накопитель не подключен, алгоритм или метод сортировки несовместимо с правилами региона или страны развития

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...