2011-05-28 46 views
1

我不完全理解PHP如何分配,所以我不知道我是否犯了错误,或者如果这是一个错误。这里的usort()是间歇性地清零数组的头部或尾部。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); 
+0

现场示例:http://codepad.org/fOdA0hca。你的意思是什么*清除头部或尾部*?排序似乎按预期工作。 – 2011-05-28 13:14:30

+1

此代码正常工作。 'usort($ mylist,compare_foos);'''compare_foos',它只是字符串,不是常量。 – 2011-05-28 13:16:23

+0

这可能是我的PHP安装中的一个错误。有时它会用null(无数据)替换第一个或最后一个元素。我不知道具体的PHP术语。它每次工作,如果我自己编码排序func。我只是想知道我是否正确地分配阵列,就这些。既然你说我是,那肯定是本地系统中的一个bug。 – gecko 2011-05-28 13:24:42

回答

2

Callbacks,像由usort所使用的一个,可以以三种不同的方式来指定:

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

    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 

要看到它,记得编写在您的开发机器上启用每个错误(但将其隐藏在生产服务器上),使用error_reporting()

error_reporting(E_ALL); // display all errors including notices 
error_reporting(0); // hide all errors 

通过,如果你想使用一个对象作为一个简单的专卖店的方式,你不需要创建一个专用类,你可以使用stdClass()

$mylist[$i] = new stdClass(); 
$mylist[$i]->idx = $i; 
$mylist[$i]->data = rand() % 20; 

此外,您还可以使用var_dump()代替的print_r你的时候调试以获取有关每个变量类型的详细信息,可以帮助您快速找出是否有问题。

+0

谢谢,这是有帮助的,教我的东西,我不知道。我可以从var_dump()中看到,usort以某种方式替换了未初始化的数组元素。 [10] => object(foo)#10(2){[“idx”] => NULL [“data”] => NULL}。我会把它放到一个PHP错误,或在我的PHP系统中的错误,并解决它。也许现在在这里谈论这个话题,但是有没有一个测试套件来验证php系统的功能? – gecko 2011-05-28 13:42:38

+0

如果我从你的问题中的代码复制到一个文件(修复回调问题,并添加php开放标签)并执行它十几次,我不能再现这种行为。你自己试过了吗? (只有问题中的代码,而不是单一行,即使你认为它不会影响它)。感觉你的问题来自其他地方。 – Lepidosteus 2011-05-28 13:45:21

+0

是的代码应该工作。这就是为什么我想征求PHP专家的意见。在另一个PHP服务器上很好。只是我猜想安装一些本地怪异。再次感谢您在解释各种PHP方面的帮助。 – gecko 2011-05-28 18:26:00