2012-01-09 3 views
10

Я выполняю некоторые sql-кеширование определенных запросов. Я использую CakePHP поэтому условия запроса в массиве таким образом:Каков самый чистый способ получить контрольную сумму многомерного массива?

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

Я в основном ищу product_id, но есть некоторые другие возможные условия, поэтому я хотел бы уменьшить массив контрольной суммы и добавьте его к имени файла кеша. Таким образом, у меня будет tutorials_by_classification-413a86af или что-то еще, и мне не придется выбирать через массив.

Я видел функцию для развязывания массивов mutli-d на php.net in the comments, но мне интересно, есть ли более простой способ достичь моей цели.

ответ

15

Как насчет serialize и md5? serialize создает строковое представление вашего массива; md5 создает хэш этого.

Пример:

$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

Спасибо, только то, что мне нужно! Я закончил использование crc32 для хэшей, потому что он сохраняет имена файлов короче http://codepad.org/LhTotSth. –

10

Я бы просто сделать это:

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

json_encode немного быстрее, чем сериализации, но вы потеряете некоторые из преимуществ сериализации. Однако для того, что вы делаете, это не имеет значения.

+0

«json_encode немного быстрее, чем сериализация». По моим оценкам, это не так - это примерно на 30% медленнее. (Но они оба довольно быстрые, так что, вероятно, это не проблема.) – lonesomeday

+0

В соответствии с этим: https://bugs.php.net/bug.php?id=51267 Я думаю, это зависит от того, массив вложен. –

+0

Либо мой массив был слишком прост, чтобы показать это, либо ошибка была исправлена ​​... – lonesomeday

Смежные вопросы