用于覆盖数组的头部或尾部?

时间:2011-05-28 13:07:34

标签: php usort

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

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);

1 个答案:

答案 0 :(得分:2)

Callbacks与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

要查看它,请记住使用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来获取有关每个变量类型的详细信息,可以帮助您快速找出问题是否存在。