9

私はこのような配列を持っています:

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 クラスを使用する必要がありますか? または、このアプリを運用モードにすると警告が表示されなくなるため、警告を無視する必要がありますか?

4

1 に答える 1

24

この質問は古く、すでに解決されていると確信していますが、CakePHP のドキュメントは、ハッシュ パス構文の使用法に関して少し不明確です。したがって、他の誰かがこれに遭遇した場合に備えて、ここに私が見つけたものがあります.

質問の構文が正しくありません。正しい構文は'Hash::extract($ratings, 'Rating.{n}[rating>-1].rating')'.

ドキュメントによると、「トークンは2つのグループで構成されています。は配列データをトラバースするために使用され、マッチャーは要素を修飾するために使用されます。」.

{n}[rating>-1]は 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 )
于 2013-07-25T19:11:56.267 に答える