2012-10-09 1 views
8

ich ein Array wie diese:CakePHPs Hash-Klasse Mit den Daten aus einem Array zu extrahieren

Array(
    [Rating] => Array(
     [0] => Array(
      [id] => 4 
      [rating] => -1 
     ), 
     [1] => Array(
      [id] => 14 
      [rating] => 9.7 
     ), 
     [2] => Array(
      [id] => 26 
      [rating] => 9.55 
     ) 
    ) 
) 

Ich brauche alle Bewertungen zu extrahieren> = 0 aus dieser Reihe, und genau die Zahlen. Ich machte das gut mit Set::extract('/Rating/rating[rating>-1]', $video)

Aber ich habe dann gelernt, dass dies veraltet ist und Sie jetzt die Hash-Klasse verwenden sollen. So sah ich die neue Syntax und schrieb:

Hash::extract($video, 'Rating.{n}.rating[rating>-1]'); 

, die mir das richtige Ergebnis gibt, aber es gibt eine lästige Warnung: 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]

Die Warnung tritt nicht auf, wenn ich nicht die Bedingung drin (die [rating>-1]) aber natürlich gehören die -1 dazu, was ich nicht will. Was mache ich hier falsch? Verwechsle ich diese Funktion irgendwie? Soll ich nur die veraltete Klasse Set verwenden? Oder sollte ich die Warnung ignorieren, weil sie nicht angezeigt wird, sobald ich diese App in den Produktionsmodus versetzt habe?

Antwort

16

Diese Frage ist alt und ich bin sicher, es ist bereits gelöst, aber die CakePHP-Dokumentation ist ein wenig unklar in Bezug auf die Verwendung der Hash-Pfadsyntax. Also, falls jemand anderes hier ist, hier ist, was ich gefunden habe.

Die Syntax in der Frage ist nicht korrekt. Die korrekte Syntax lautet 'Hash::extract($ratings, 'Rating.{n}[rating>-1].rating')'.

Nach der Dokumentation: „Tokens sind aus zwei Gruppen zusammen Expressions, werden verwendet, um die Array-Daten zu durchlaufen, während Matcher Elemente zu qualifizieren verwendet..“.

{n}[rating>-1] gilt als Token. {n} ist der Ausdruck, der die Array-Schlüssel filtert, in diesem Fall muss der Schlüssel numerisch sein. [rating>-1] ist der Matcher, der die Array-Elemente filtert. In diesem Fall muss das Element ein Array sein, das einen Schlüssel mit dem Namen rating und einen zugehörigen Wert enthält, der größer als -1 ist. Sobald Sie das Array-Element haben, können Sie die rating bekommen.

$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')); 

Ergebnisse in:

Array ([0] => 9.7 [1] => 9.55) 
Verwandte Themen