2012-01-09 10 views
10

Estoy haciendo algo de almacenamiento en caché SQL de ciertas consultas. Estoy usando CakePHP por lo que las condiciones de la consulta están en una matriz de este modo:¿Cuál es la forma más limpia de obtener una suma de comprobación de una matriz multidimensional?

array (
    0 => 
    array (
    0 => 'Tutorial.id IN (SELECT tutorial_id FROM classifications WHERE classifications.product_id = 1) ', 
), 
    1 => 
    array (
    'Tutorial.status_id ' => 
    array (
     0 => 4, 
     1 => 7, 
    ), 
), 
    'OR' => 
    array (
    'Tutorial.user_id' => '40', 
), 
); 

Estoy sobre todo en busca de la product_id, pero hay algunas otras condiciones posibles, así que quería reducir la matriz a una suma de comprobación y añádalo al nombre del archivo de caché. De esta manera tendría tutorials_by_classification-413a86af o algo así, y no tendría que elegir a través de la matriz.

He visto la función para implosionar matrices mutli-d en php.net in the comments, pero me pregunto si hay una forma más sencilla de lograr mi objetivo.

Respuesta

15

¿Qué tal serialize y md5? serialize crea una representación de cadena de su matriz; md5 crea un hash de él.

Ejemplo:

$query = array (
    0 => 
    array (
    0 => 'Tutorial.id IN (SELECT tutorial_id FROM classifications WHERE classifications.product_id = 1) ', 
), 
    1 => 
    array (
    'Tutorial.status_id ' => 
    array (
     0 => 4, 
     1 => 7, 
    ), 
), 
    'OR' => 
    array (
    'Tutorial.user_id' => '40', 
), 
); 

$query_string = serialize($query); 
$hash = md5($query_string); 

echo $query_string, "\n\n\n", $hash, "\n"; 

/* 
a:3:{i:0;a:1:{i:0;s:96:"Tutorial.id IN (SELECT tutorial_id FROM classifications WHERE classifications.product_id = 1) ";}i:1;a:1:{s:19:"Tutorial.status_id ";a:2:{i:0;i:4;i:1;i:7;}}s:2:"OR";a:1:{s:16:"Tutorial.user_id";s:2:"40";}} 


a5cb59f0ee259961e426c7ce9b7b8f32 
*/ 
+0

¡Gracias, justo lo que necesitaba! Terminé usando crc32 para hashes porque mantiene los nombres de archivo más cortos http://codepad.org/LhTotSth. –

10

me acaba de hacer esto:

$checksum = md5(json_encode($array)); 

json_encode es ligeramente más rápido que serializar, pero se pierden algunos de los beneficios de la serialización. Sin embargo, por lo que estás haciendo, eso no importa.

+0

"json_encode es ligeramente más rápido que serializar". De acuerdo con mis puntos de referencia, no es - es aproximadamente un 30% más lento. (Pero ambos son bastante rápidos, por lo que probablemente no es una preocupación). – lonesomeday

+0

De acuerdo con esto: https://bugs.php.net/bug.php?id=51267 Supongo que depende de si su array está anidado. –

+0

O mi matriz fue demasiado simple para mostrar esto, o el error se ha solucionado ... – lonesomeday

Cuestiones relacionadas