使用cakePHP的Hash类从数组中提取数据

时间:2012-10-09 21:53:23

标签: cakephp-2.0

我有一个这样的数组:

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类吗?或者我应该忽略警告,因为一旦我将此应用程序置于生产模式后它就不会出现?

1 个答案:

答案 0 :(得分:20)

这个问题很老,我确信它已经解决了,但CakePHP文档对于Hash路径语法的使用有点不清楚。所以,万一其他人遇到过这个,这就是我找到的。

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

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

{n}[rating>-1]被视为一个令牌{n}是过滤数组键的表达式,在这种情况下,键必须是数字。 [rating>-1]是过滤数组元素的匹配器,在这种情况下,元素必须是包含名为rating的键的数组,且关联值大于{{ 1}}。获得数组元素后,即可获得-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') );