我有一个用户定义的排序函数,它使用'全局'声明,以便在决定正确的排序顺序时引用多维数组。它曾经在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";
}
答案 0 :(得分:1)
如果您不打算按实际密钥排序,请不要使用uksort
,而是usort
或uasort
:
function cmp($a, $b) {
return $a['val2'] - $b['val2'];
}
uasort($arr, 'cmp');
答案 1 :(得分: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)