Php usort覆盖数组的头部还是尾部?

Php usort覆盖数组的头部还是尾部?,php,usort,Php,Usort,我不完全理解PHP是如何分配的,所以我不知道我是否犯了错误,或者这是一个bug 这里的usort()会间歇性地将数组的头部或尾部归零 class foo { public $idx; public $data; } function compare_foos ($a, $b) { if ($a->data == $b->data) return 0; elseif ($a->data < $b->data) return -1;

我不完全理解PHP是如何分配的,所以我不知道我是否犯了错误,或者这是一个bug

这里的usort()会间歇性地将数组的头部或尾部归零

class foo
{
  public $idx;
  public $data;
}

function compare_foos ($a, $b)
{
  if ($a->data == $b->data)
    return 0;
  elseif ($a->data < $b->data)
    return -1;
  else
    return 1;
}

$mylist = Array ();

for ($i=0; $i < 10; ++$i)
{
  $mylist[$i] = new foo ();
  $mylist[$i]->idx = $i;
  $mylist[$i]->data = rand() % 20;
}

print_r ($mylist);
usort ($mylist, compare_foos);
echo "<HR>";
print_r ($mylist);
class-foo
{
公费$idx;
公共数据;
}
函数比较\u foos($a,$b)
{
如果($a->data==$b->data)
返回0;
elseif($a->数据<$b->数据)
返回-1;
其他的
返回1;
}
$mylist=Array();
对于($i=0;$i<10;++$i)
{
$mylist[$i]=newfoo();
$mylist[$i]->idx=$i;
$mylist[$i]->data=rand()%20;
}
打印(mylist);
usort($mylist,compare\u foos);
回声“
”; 打印(mylist);
,与usort使用的一样,可以用3种不同的方式指定:

  • 包含函数名称的字符串:

    usort($mylist, 'compare_foos');
    
  • 实际功能:

    usort($mylist, create_function(/*...*/));
    // php >= 5.3 only:
    usort($mylist, function ($a, $b) {
       /* ... */
    });
    
  • 用于访问对象方法的数组:

    usort($mylist, array($myobject, 'mymethod'));
    
使用回调的方式无效,php返回错误:

PHP Notice:  Use of undefined constant compare_foos - assumed 'compare_foos' in /home/lepidosteus/test.php on line 28
要查看它,请记住在开发计算机上启用每个错误(但在生产服务器上隐藏它们)并使用以下代码:

顺便说一句,如果要将对象用作简单存储,则无需创建专用类即可使用:

此外,在调试时,您可以使用而不是打印来获取有关每个变量类型的详细信息,这可以帮助您快速找出是否有问题。

与usort使用的一样,可以通过3种不同的方式指定:

  • 包含函数名称的字符串:

    usort($mylist, 'compare_foos');
    
  • 实际功能:

    usort($mylist, create_function(/*...*/));
    // php >= 5.3 only:
    usort($mylist, function ($a, $b) {
       /* ... */
    });
    
  • 用于访问对象方法的数组:

    usort($mylist, array($myobject, 'mymethod'));
    
使用回调的方式无效,php返回错误:

PHP Notice:  Use of undefined constant compare_foos - assumed 'compare_foos' in /home/lepidosteus/test.php on line 28
要查看它,请记住在开发计算机上启用每个错误(但在生产服务器上隐藏它们)并使用以下代码:

顺便说一句,如果要将对象用作简单存储,则无需创建专用类即可使用:


此外,您可以在调试时使用而不是打印来获取有关每个变量类型的详细信息,这可以帮助您快速找出是否有问题。

Live example:。你把头或尾归零是什么意思?排序似乎按预期工作。此代码工作正常<代码>usort($mylist,compare\u foos)-quote
compare\u foos
,它只是字符串,不是常量。这可能是我的php安装中的一个bug。有时,它用null(无数据)替换第一个或最后一个元素。我不知道它的具体PHP术语。如果我自己编写排序函数,它每次都有效。我只是想知道我是否正确分配了数组,仅此而已。既然你说我是,那一定是本地系统中的一个bug。你把头或尾归零是什么意思?排序似乎按预期工作。此代码工作正常<代码>usort($mylist,compare\u foos)-quote
compare\u foos
,它只是字符串,不是常量。这可能是我的php安装中的一个bug。有时,它用null(无数据)替换第一个或最后一个元素。我不知道它的具体PHP术语。如果我自己编写排序函数,它每次都有效。我只是想知道我是否正确分配了数组,仅此而已。既然你说我是,那一定是本地系统的一个bug。谢谢,这很有帮助,教给了我一些我不知道的东西。我可以从var_dump()中看出,usort以某种方式将数组的一个元素替换为未初始化的元素。[10] =>object(foo)#10(2){[“idx”]=>NULL[“data”]=>NULL}。我将把它归结为一个php错误,或者我的php系统中的一个错误,并解决它。也许现在已经脱离主题了,但是是否有一个测试套件来验证php系统的功能呢?如果我将您的问题中的代码复制到一个文件中(修复回调问题并添加php开始标记)并执行十几次,我就无法重现这种行为。你自己试过吗?(只有问题中的代码,没有一行多,即使你认为它不会影响它)。感觉您的问题来自其他地方。是的,代码应该可以工作。这就是为什么我想寻求PHP专家的建议。在不同的PHP服务器上也可以。我猜只是一些本地安装的奇怪之处。再次感谢您在解释各种PHP方面的帮助。谢谢,这很有帮助,并且教会了我一些我不知道的东西。我可以从var_dump()中看出,usort以某种方式将数组的一个元素替换为未初始化的元素。[10] =>object(foo)#10(2){[“idx”]=>NULL[“data”]=>NULL}。我将把它归结为一个php错误,或者我的php系统中的一个错误,并解决它。也许现在已经脱离主题了,但是是否有一个测试套件来验证php系统的功能呢?如果我将您的问题中的代码复制到一个文件中(修复回调问题并添加php开始标记)并执行十几次,我就无法重现这种行为。你自己试过吗?(只有问题中的代码,没有一行多,即使你认为它不会影响它)。感觉您的问题来自其他地方。是的,代码应该可以工作。这就是为什么我想寻求PHP专家的建议。在不同的PHP服务器上也可以。我猜只是一些本地安装的奇怪之处。再次感谢您帮助解释各种PHP内容。