2012-01-09 5 views
10

Sto facendo qualche caching sql di alcune query. Sto utilizzando CakePHP quindi le condizioni della query sono in un array così:Qual è il modo più pulito per ottenere il checksum di un array multidimensionale?

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

Sono per lo più cercando il product_id, ma ci sono alcune altre condizioni possibili, così ho voluto ridurre l'array a un checksum e aggiungilo al nome del file cache. In questo modo avrei tutorials_by_classification-413a86af o qualcosa del genere, e non avrei dovuto selezionare l'array.

Ho visto la funzione di implodere array mutli-d su php.net in the comments, ma mi chiedo se c'è un modo più semplice per raggiungere il mio obiettivo.

risposta

15

Che ne dici di serialize e md5? serialize crea una rappresentazione di stringa dell'array; md5 crea un hash di esso.

Esempio:

$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

Grazie, proprio quello di cui avevo bisogno! Ho finito per usare crc32 per hash perché mantiene i nomi dei file più brevi http://codepad.org/LhTotSth. –

10

vorrei solo fare questo:

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

json_encode è leggermente più veloce di serializzare, ma si perde alcuni dei vantaggi di serializzare. Tuttavia, per quello che stai facendo, non importa.

+0

"json_encode è leggermente più veloce di serializzare". Secondo i miei benchmark, non lo è - è circa il 30% più lento. (Ma sono entrambi abbastanza veloci, quindi probabilmente non è una preoccupazione.) – lonesomeday

+0

Secondo questo: https://bugs.php.net/bug.php?id=51267 Suppongo che dipenda dal fatto che la matrice è annidata. –

+0

O il mio array era troppo semplice per mostrare questo, o il bug è stato corretto ... – lonesomeday