php - uasort() 数组被用户比较函数修改

标签 php

我有一个基本上是数组包装器并实现 IteratorAggregate 的类。 当创建该类的新对象时,它将其值存储在一个名为 $value 的 protected 变量中。该值可以是字符串、整数等。或可遍历的对象(如数组)。

这个对象是“递归的”,因为当一个可遍历对象(如数组)被传递给构造函数时,他创建了该类的另一个实例。这是要澄清的构造函数:

class ListItem implements \IteratorAggregate
{
    protected $readOnly = false;
    protected $key;
    protected $value;

    public function __construct($key, $value, $readOnly = false)
    {
        if($readOnly) $this->readOnly = true;
        if(is_numeric($key)) $key = 'index'.$key;
        $this->key = $key;

        if (is_array($value) || $value instanceof Traversable) {
            $this->value = array();
            foreach($value as $k => $v) {
                if(is_numeric($k)) $k = 'index'.$k;
                $this->value[$k] =  new ListItem($k, $v, $readOnly);
            }
        } else {
            $this->value = $value;
        }
    }

    public function __toString()
    {
        if ( is_array($this->value) ) {
            return 'ListItem OBJECT(' . count($this->value) . ')';
        } else {
            return $this->value;
        }
    }

现在,我正在尝试为该类编写一个简单的排序方法。

要按 Key 排序,这就像一个魅力:

$success = ksort($this->value, $comparison);

但要按值排序,asort 不起作用,因为我尝试排序的实际值存储在 value 属性中。

所以我尝试使用 uasort,像这样:

   $success = uasort($this->value, function ($a, $b)
   {                    
      if ($a->value == $b->value) return 0;
      else if($a->value < $b->value) return -1;
      else return 1;
   });

但由于某些不明原因,我收到以下错误:

Warning: uasort() [function.uasort]: Array was modified by the user comparison function in /* /* /* /ListItem.php on line 129


问。如果我只是访问 $value 进行比较而不实际更改任何内容,为什么会发生这种情况?

最佳答案

似乎闭包(或匿名函数)在全局范围内,这意味着 uasort 无法访问 ListItem 对象的私有(private)或 protected 成员(尽管其他 ListItem 对象可以访问其兄弟的私有(private)/ protected 属性)

这解决了问题:(转换为字符串)

$success = uasort($this->value, function ($objA, $objB) use ($comparison)
{
    $a = (string) $objA;
    $b = (string) $objB;
    if($comparison == ListItem::SORT_NUMERIC) {
        if (is_numeric($a)) $a = (int) $a;
        if (is_numeric($b)) $b = (int) $b;
    }                   
    if ($a == $b) return 0;
    else if($a < $b) return -1;
    else return 1;
});

关于php - uasort() 数组被用户比较函数修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12992568/

相关文章:

php - 给定子索引时返回 PHP 数组父索引

php - 在事件 checkout_cart_product_add_after 中获取产品属性

php - 存储序列化数组时进行清理

php - 如何确定请求来自 REST api

php - PHP级别系统?

php - 变量不在 PHP 循环中传递/更新

php - MySQLi stmt num_rows 返回 0

php - shell_exec 没有在后台运行?

php - Twig:渲染 Controller 与宏

php - Laravel Eloquent - 在 PostgreSQL 中更新 JSON col 时遇到问题