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

mit*_*emo 8 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
        )
    )
)
Run Code Online (Sandbox Code Playgroud)

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

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

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

这给了我正确的结果,但它给出了一个恼人的警告: 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类吗?或者我应该忽略警告,因为一旦我将此应用程序置于生产模式,它就不会显示出来?

Mjr*_*agi 21

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

问题中的语法不正确.正确的语法是'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') );
Run Code Online (Sandbox Code Playgroud)

结果是:

Array ( [0] => 9.7 [1] => 9.55 )
Run Code Online (Sandbox Code Playgroud)