为什么排序会失败?

时间:2011-03-18 16:21:20

标签: php sorting

我正在编写一个库例程,其中包括对嵌套数组进行一些相当复杂的排序。

我从文档中看到,所有数组排序函数(包括使用内置比较器的函数)都可以在失败时返回false - 但是什么时候会出现这种情况?

4 个答案:

答案 0 :(得分:10)

当你发送给函数的变量是 NOT 一个数组时,它会失败 例如:

asort('Hello');//fails
asort(array(1,2,35,7,2,8,3));//true

答案 1 :(得分:2)

当提供的参数不是数组(或者甚至只是一个空数组)时。

答案 2 :(得分:2)

我也偶然发现了这个问题,并做了一些研究,如果还有其他条件,当排序返回false时。查看代码中显示的this sort函数

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_sortzend_hash_sort是一个宏,它实际上调用zend_hash_sort_ex。此函数健壮可靠,即使在传递带有完全不可比较元素的数组时,它也会在all cases中返回SUCCESS。

这使我们回到sort函数,该函数使用宏进行一些参数检查并具有三个规则。

  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

答案 3 :(得分:-1)

返回false的示例可能包括空数组,变量不是数组,内存不足,库调用失败,排序模块运行时失败,调用参数无效,磁盘包或驱动器不在线,排序算法或方法不符合该地区或发展中国家的规则