9

我有一个这样的数组:

Array(
    [Rating] => Array(
        [0] => Array(
            [id] => 4
            [rating] => -1
        ),
        [1] => Array(
            [id] => 14
            [rating] => 9.7
        ),
        [2] => Array(
            [id] => 26
            [rating] => 9.55
        )
    )
)

我需要从这个数组中提取所有评级> = 0,并且只提取数字。我做得很好Set::extract('/Rating/rating[rating>-1]', $video)

但后来我了解到这已被弃用,你现在应该使用 Hash 类。所以我查找了新语法并写道:

Hash::extract($video, 'Rating.{n}.rating[rating>-1]');

这给了我正确的结果,但它给出了一个恼人的警告:Warning (4096): Argument 1 passed to Hash::_matches() must be an array, string given, called in E:\www\lib\Cake\Utility\Hash.php on line 131 and defined [CORE\Cake\Utility\Hash.php, line 170]

当我没有条件时不会出现警告([rating>-1]),但当然包括我不想要的 -1。我在这里做错了什么?我是否以某种方式滥用了这个功能?我应该只使用已弃用的 Set 类吗?还是我应该忽略警告,因为一旦我将此应用程序置于生产模式,它就不会出现?

4

1 回答 1

24

这个问题很老,我确信它已经解决了,但是 CakePHP 文档对于哈希路径语法的使用有点不清楚。因此,以防其他人遇到此问题,这就是我发现的。

问题中的语法不正确。正确的语法是'Hash::extract($ratings, 'Rating.{n}[rating>-1].rating')'.

根据文档:“标记由两组组成。表达式,用于遍历数组数据,而匹配器用于限定元素。”。

{n}[rating>-1]被认为是一个令牌{n}是过滤数组键的表达式,在这种情况下,键必须是数字。[rating>-1]是过滤数组元素的匹配器,在这种情况下,元素必须是一个数组,其中包含一个名为的键rating和一个大于的关联值-1。一旦你有了数组元素,你就可以得到rating.

    $ratings = array(
        'Rating' => array(
            array(
                'id' => 4,
                'rating' => -1
            ),
            array(
                'id' => 14,
                'rating' => 9.7
            ),
            array(
                'id' => 26,
                'rating' => 9.55
            )
        )
    );
    print_r( Hash::extract($ratings, 'Rating.{n}[rating>-1].rating') );

结果是:

Array ( [0] => 9.7 [1] => 9.55 )
于 2013-07-25T19:11:56.267 回答