ฉันกำลังเข้าร่วมปาร์ตี้ที่แออัดมากโดยการตอบรับ แต่มีข้อควรพิจารณาที่สำคัญคือไม่มีคำตอบใดที่ยังหลงเหลืออยู่ ค่าของjson_encode()
และserialize()
ทั้งสองขึ้นอยู่กับลำดับขององค์ประกอบในอาร์เรย์!
นี่คือผลลัพธ์ของการไม่เรียงลำดับและเรียงลำดับอาร์เรย์ในสองอาร์เรย์ที่มีค่าเหมือนกัน แต่เพิ่มในลำดับที่ต่างกัน (โค้ดที่ด้านล่างของโพสต์) :
serialize()
1c4f1064ab79e4722f41ab5a8141b210
1ad0f2c7e690c8e3cd5c34f7c9b8573a
json_encode()
db7178ba34f9271bfca3a05c5dddf502
c9661c0852c2bd0e26ef7951b4ca9e6f
Sorted serialize()
1c4f1064ab79e4722f41ab5a8141b210
1c4f1064ab79e4722f41ab5a8141b210
Sorted json_encode()
db7178ba34f9271bfca3a05c5dddf502
db7178ba34f9271bfca3a05c5dddf502
ดังนั้นสองวิธีที่ฉันจะแนะนำให้แฮชอาร์เรย์คือ:
// 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)) );
ทางเลือกของjson_encode()
หรือserialize()
ควรได้รับการกำหนดโดยการทดสอบกับชนิดของข้อมูลที่คุณกำลังใช้ จากการทดสอบของฉันเองเกี่ยวกับข้อมูลที่เป็นข้อความและตัวเลขล้วนๆหากโค้ดไม่ได้ทำงานแบบวนซ้ำเป็นพัน ๆ ครั้งความแตกต่างก็ไม่คุ้มกับการเปรียบเทียบ ฉันเองใช้json_encode()
สำหรับข้อมูลประเภทนั้น
นี่คือรหัสที่ใช้สร้างการทดสอบการเรียงลำดับด้านบน:
$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";
การใช้ deep_ksort () อย่างรวดเร็วของฉันเหมาะกับกรณีนี้ แต่ตรวจสอบก่อนใช้กับโครงการของคุณเอง:
/*
* 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;
}