我有一个像这样的数组:
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类吗?还是我应该忽略警告,因为一旦将该应用程序投入生产模式,警告将不会显示?
最佳答案
这个问题已经很老了,我敢肯定它已经解决了,但是CakePHP文档对于Hash path语法的用法还不太清楚。因此,如果有人遇到了这个问题,这就是我的发现。
问题中的语法不正确。正确的语法是'Hash::extract($ratings, 'Rating.{n}[rating>-1].rating')'
。
根据文档:“ token 由两组组成。表达式用于遍历数组数据,而匹配项用于限定元素。{n}[rating>-1]
被视为一个 token 。 {n}
是表达式,它过滤数组键,在这种情况下,键必须是数字。 [rating>-1]
是匹配器,它过滤数组元素,在这种情况下,该元素必须是一个数组,其中包含一个名为rating
的键以及一个大于-1
的关联值。一旦有了array元素,就可以得到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 )
关于cakephp-2.0 - 使用cakePHP的Hash类从数组中提取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12808983/