我有一个数组
Array( [0] => Array ( [0] => 33 [user_id] => 33 [1] => 3 [frame_id] => 3 ) [1] => Array ( [0] => 33 [user_id] => 33 [1] => 3 [frame_id] => 3 ) [2] => Array ( [0] => 33 [user_id] => 33 [1] => 8 [frame_id] => 8 ) [3] => Array ( [0] => 33 [user_id] => 33 [1] => 3 [frame_id] => 3 ) [4] => Array ( [0] => 33 [user_id] => 33 [1] => 3 [frame_id] => 3 ) )
如您所见,键0与1、3和4相同。键2与它们全部不同。
在它们上运行array_unique函数时,唯一剩下的是
Array ( [0] => Array ( [0] => 33 [user_id] => 33 [1] => 3 [frame_id] => 3 ) )
有什么想法为什么array_unique无法按预期工作?
这是因为array_unique使用字符串比较来比较项目。从文档:
array_unique
注意:当且仅当(string)$ elem1 ===(string)$ elem2,两个元素才被视为相等。换句话说:当字符串表示相同时。将使用第一个元素。
数组的字符串表示形式就是单词Array,无论其内容是什么。
Array
您可以使用以下方法完成您想做的事情:
$arr = array( array('user_id' => 33, 'frame_id' => 3), array('user_id' => 33, 'frame_id' => 3), array('user_id' => 33, 'frame_id' => 8) ); $arr = array_intersect_key($arr, array_unique(array_map('serialize', $arr))); //result: array 0 => array 'user_id' => int 33 'user' => int 3 2 => array 'user_id' => int 33 'user' => int 8
运作方式如下:
每个数组项都已序列化。根据阵列的内容,这将是唯一的。
这样的结果一直运行到array_unique,因此仅保留具有唯一签名的数组。
array_intersect_key 将从map / unique函数中获取唯一项的键(因为保留了源数组的键),并将其从原始源数组中拉出。
array_intersect_key