我有一个这样的数组:
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类吗?或者我应该忽略警告,因为一旦我将此应用程序置于生产模式后它就不会出现?
答案 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') );