2012-10-09 22 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::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')'です。ドキュメントによれば

トークンは、2つのグループで構成され表現は、配列データをトラバースするために使用される、のmatcherの要素を修飾するために使用されます。」。

{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) 
関連する問題