什么';s是获取多维数组校验和的最干净的方法


What's the cleanest way to get a checksum of a multidimensional array?

我正在对某些查询进行一些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之类的东西,而且我不必在数组中进行挑选。

我在评论中看到了在php.net上内爆mutli-d数组的功能,但我想知道是否有更简单的方法来实现我的目标。

serializemd5怎么样?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
*/

我会这么做:

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

jsonencode比序列化稍微快一些,但是您失去了序列化的一些好处。然而,对于你正在做的事情来说,这并不重要。