Saya bergabung dengan pesta yang sangat ramai dengan menjawab, tetapi ada pertimbangan penting bahwa tidak ada jawaban yang masih ada yang alamat. Nilai json_encode()
dan serialize()
keduanya bergantung pada urutan elemen dalam larik!
Berikut adalah hasil dari tidak mengurutkan dan mengurutkan array, pada dua array dengan nilai yang identik tetapi ditambahkan dalam urutan yang berbeda (kode di bagian bawah posting) :
serialize()
1c4f1064ab79e4722f41ab5a8141b210
1ad0f2c7e690c8e3cd5c34f7c9b8573a
json_encode()
db7178ba34f9271bfca3a05c5dddf502
c9661c0852c2bd0e26ef7951b4ca9e6f
Sorted serialize()
1c4f1064ab79e4722f41ab5a8141b210
1c4f1064ab79e4722f41ab5a8141b210
Sorted json_encode()
db7178ba34f9271bfca3a05c5dddf502
db7178ba34f9271bfca3a05c5dddf502
Oleh karena itu, dua metode yang saya rekomendasikan untuk melakukan hash sebuah array adalah:
// You will need to write your own deep_ksort(), or see
// my example below
md5( serialize(deep_ksort($array)) );
md5( json_encode(deep_ksort($array)) );
Pilihan json_encode()
atau serialize()
harus ditentukan dengan menguji jenis data yang Anda gunakan . Dengan pengujian saya sendiri pada data tekstual dan numerik murni, jika kode tidak menjalankan loop ketat ribuan kali maka perbedaannya bahkan tidak layak untuk dijadikan tolok ukur. Saya pribadi menggunakan json_encode()
untuk jenis data itu.
Berikut adalah kode yang digunakan untuk menghasilkan tes pengurutan di atas:
$a = array();
$a['aa'] = array( 'aaa'=>'AAA', 'bbb'=>'ooo', 'qqq'=>'fff',);
$a['bb'] = array( 'aaa'=>'BBBB', 'iii'=>'dd',);
$b = array();
$b['aa'] = array( 'aaa'=>'AAA', 'qqq'=>'fff', 'bbb'=>'ooo',);
$b['bb'] = array( 'iii'=>'dd', 'aaa'=>'BBBB',);
echo " serialize()\n";
echo md5(serialize($a))."\n";
echo md5(serialize($b))."\n";
echo "\n json_encode()\n";
echo md5(json_encode($a))."\n";
echo md5(json_encode($b))."\n";
$a = deep_ksort($a);
$b = deep_ksort($b);
echo "\n Sorted serialize()\n";
echo md5(serialize($a))."\n";
echo md5(serialize($b))."\n";
echo "\n Sorted json_encode()\n";
echo md5(json_encode($a))."\n";
echo md5(json_encode($b))."\n";
Implementasi deep_ksort () saya yang cepat, cocok dengan kasus ini, tetapi periksa sebelum digunakan pada proyek Anda sendiri:
/*
* Sort an array by keys, and additionall sort its array values by keys
*
* Does not try to sort an object, but does iterate its properties to
* sort arrays in properties
*/
function deep_ksort($input)
{
if ( !is_object($input) && !is_array($input) ) {
return $input;
}
foreach ( $input as $k=>$v ) {
if ( is_object($v) || is_array($v) ) {
$input[$k] = deep_ksort($v);
}
}
if ( is_array($input) ) {
ksort($input);
}
// Do not sort objects
return $input;
}