1

我有一个用户定义的排序函数,它使用“全局”声明以便在决定正确的排序顺序时引用多维数组。它曾经在 PHP 5.1.6 下工作正常,但现在在 5.3.3 下失败。

代码抛出 PHP 警告:

PHP 警告:uksort(): 数组被用户比较函数修改

但是代码绝对不会修改数组。

这段代码重复了这个问题:

$arr = array();

$arr['i1']['val1'] = 99;
$arr['i1']['val2'] = 100;

$arr['i2']['val1'] = 89;
$arr['i2']['val2'] = 101;


function cmp($a, $b)
{
    global $arr;

    if ($arr[$a]['val2'] > $arr[$b]['val2']) { return 1; }
    if ($arr[$a]['val2'] < $arr[$b]['val2']) { return -1; }
    return 0;
}

if (uksort($arr, 'cmp'))
{
    echo "success";
}
else
{
    echo "failure";
}
4

2 回答 2

1

如果您不打算按实际键排序,请不要使用uksortbutusortuasort

function cmp($a, $b) {
    return $a['val2'] - $b['val2'];
}

uasort($arr, 'cmp');
于 2013-08-29T09:47:48.413 回答
0

由于回避这个问题如此受欢迎,以下是您的问题的原因:

global $arr;

我确定您已经感觉到了,要解决这个问题,请删除该行并替换$arr$GLOBALS['arr']. 这将删除修改消息,您将访问符号表中的全局变量,而不是uksort当前正在操作的变量。

例子:

<?php
$arr = array();

$arr['i1']['val1'] = 99;
$arr['i1']['val2'] = 100;

$arr['i2']['val1'] = 89;
$arr['i2']['val2'] = 101;


function cmp($a, $b)
{
    if ($GLOBALS['arr'][$a]['val2'] > $GLOBALS['arr'][$b]['val2']) { return 1; }
    if ($GLOBALS['arr'][$q]['val2'] < $GLOBALS['arr'][$b]['val2']) { return -1; }
    return 0;
}

if (uksort($arr, 'cmp'))
{
    echo "success\n";
}
else
{
    echo "failure\n";
}

print_r($arr);

5.3.23 - 5.5.3 的输出:(其他版本崩溃/行为不端)

success
Array
(
    [i1] => Array
        (
            [val1] => 99
            [val2] => 100
        )

    [i2] => Array
        (
            [val1] => 89
            [val2] => 101
        )

)

Ups,也许这就是为什么您在最近的版本中看到警告的原因:(演示:http: //3v4l.org/DkK3v

在此处输入图像描述

于 2013-08-29T10:02:25.677 回答