Какой самый чистый способ получить контрольную сумму многомерного массива?

Я выполняю некоторые 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 в комментариях, но мне интересно, есть ли более простой способ достичь моего цель.

Ответ 1

Как насчет 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
*/

Ответ 2

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

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

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