2012-10-09 9 views
8

Tengo una matriz de esta manera:El uso de la clase Hash de CakePHP para extraer datos de una matriz

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

tengo que extraer todas las clasificaciones> = 0 A partir de esta matriz, y sólo los números. Estaba haciendo esto bien con Set::extract('/Rating/rating[rating>-1]', $video)

Pero luego me enteré de que esto está en desuso y se supone que debes usar la clase Hash ahora. Así que busqué la nueva sintaxis y escribió:

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

que me da el resultado correcto, pero da una advertencia molesto: 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]

La advertencia no se produce cuando no tengo la condición allí (el [rating>-1]) pero por supuesto incluye el -1, que no quiero. ¿Qué estoy haciendo mal aquí? ¿Estoy haciendo mal uso de esta función de alguna manera? ¿Debo usar la clase desaprobada Set? ¿O debería simplemente ignorar la advertencia porque no se mostrará una vez que coloque esta aplicación en modo de producción?

Respuesta

16

Esta pregunta es antigua y estoy seguro de que ya está resuelta, pero la documentación de CakePHP no está nada clara con respecto al uso de la sintaxis de la ruta hash. Entonces, en caso de que alguien más haya encontrado esto, esto es lo que encontré.

La sintaxis en la pregunta no es correcta. La sintaxis correcta es 'Hash::extract($ratings, 'Rating.{n}[rating>-1].rating')'.

De acuerdo con la documentación: "Tokens se componen de dos grupos Expresiones, se utilizan para atravesar la matriz de datos, mientras que igualadores de se utilizan para calificar elementos..".

{n}[rating>-1] se considera un token. {n} es la expresión que filtra las teclas de matriz, en este caso la clave debe ser numérica. [rating>-1] es el matcher que filtra los elementos de la matriz, en este caso el elemento debe ser una matriz que contiene una clave denominada rating y un valor asociado que es mayor que -1. Una vez que tenga el elemento de matriz, puede obtener el 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')); 

Resultados en:

Array ([0] => 9.7 [1] => 9.55) 
Cuestiones relacionadas