2012-10-09 60 views
8

提取数据我有一个数组这样的:使用CakePHP的哈希类从阵列

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

回答

16

这个问题很老,我相信它已经解决了,但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)