2012-10-09 4 views
8

Ho un array come questo:utilizzando la classe Hash di cakePHP per estrarre i dati da un array

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

ho bisogno di estrarre tutti i feedback> = 0 di questa serie, e solo i numeri. Stavo facendo questo bene con Set::extract('/Rating/rating[rating>-1]', $video)

Ma poi ho appreso che questo è deprecato e si suppone di utilizzare la classe di hash ora. Così ho guardato la nuova sintassi e scrissi:

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

che mi dà il risultato corretto, ma dà un avvertimento fastidioso: 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]

L'avviso non si verifica quando non ho la condizione lì (lo [rating>-1]), ma ovviamente include i -1, che non voglio. Cosa sto facendo di sbagliato qui? Sto abusando di questa funzione in qualche modo? Dovrei semplicemente usare la classe Set deprecata? O dovrei semplicemente ignorare l'avviso perché non verrà visualizzato una volta che avrò messo questa app in modalità produzione?

risposta

16

Questa domanda è vecchia e sono sicuro che è già stata risolta, ma la documentazione di CakePHP non è chiara per quanto riguarda l'uso della sintassi del percorso di hash. Quindi, nel caso in cui qualcun altro si sia imbattuto in questo, ecco cosa ho trovato.

La sintassi nella domanda non è corretta. La sintassi corretta è 'Hash::extract($ratings, 'Rating.{n}[rating>-1].rating')'.

Secondo la documentazione: "Gettoni sono composte da due gruppi Espressioni, sono utilizzati per attraversare i dati di matrice, mentre matchers vengono usati per qualificare elementi."..

{n}[rating>-1] è considerato uno token. {n} è l'espressione che filtra le chiavi dell'array, in questo caso la chiave deve essere numerica. [rating>-1] corrisponde al coordinatore che filtra gli elementi dell'array, in questo caso l'elemento deve essere un array che contiene una chiave denominata rating e un valore associato maggiore di -1. Una volta ottenuto l'elemento dell'array, è possibile ottenere lo 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')); 

Risultati in:

Array ([0] => 9.7 [1] => 9.55) 
Problemi correlati