我正在使用以下代码来输出数组:
echo "======output without array_unique=====";
var_dump($selected);
echo "=====output with array_unique=====";
var_dump(array_unique($selected));die;
输出是:
======output without array_unique=====
array
0 =>
array
'uri' => string 'http://localhost/conferences/tags/0caf4c990e0a385156b33fee58e7e3fb' (length=63)
'tag' => string '1' (length=1)
'weight' => float 4
'selected' => string 'select' (length=6)
1 =>
array
'uri' => string 'http://localhost/conferences/tags/0caf4c990e0a385156b33fee58e7e3fb' (length=63)
'tag' => string '1' (length=1)
'weight' => float 4
'selected' => string 'select' (length=6)
2 =>
array
'uri' => string 'http://localhost/conferences/tags/ffc709d5131f752df8aae22d7da4240f' (length=63)
'tag' => string '2' (length=1)
'weight' => float 4
'selected' => string '' (length=0)
3 =>
array
'uri' => string 'http://localhost/conferences/tags/035c60c7f090412cc905cee008fbeba8' (length=63)
'tag' => string '3' (length=1)
'weight' => float 0
'selected' => string '' (length=0)
4 =>
array
'uri' => string 'http://localhost/conferences/tags/4137dbc16ef1a2079eb6cacb62dd8521' (length=63)
'tag' => string '4' (length=1)
'weight' => float 0
'selected' => string '' (length=0)
=====output with array_unique=====
array
0 =>
array
'uri' => string 'http://localhost/conferences/tags/0caf4c990e0a385156b33fee58e7e3fb' (length=63)
'tag' => string '1' (length=1)
'weight' => float 4
'selected' => string 'select' (length=6)
有人可以解释一下,为什么我只使用array_unique中的一个元素来获取数组?
答案 0 :(得分:11)
将数组元素强制转换为字符串以进行比较 - 这是manual page for array_unique
中的相关代码段注意:考虑两个要素 等于且仅当(字符串)$ elem1 ===(字符串)$ elem2。用文字表示:当字符串表示相同时。 将使用第一个元素。
一旦你的数组元素被转换为字符串,它们只有值“Array”,这当然会使每个元素看起来都相同,而你最终只使用第一个元素。
这是一种可以从像你这样的数组中删除重复项的方法
$seen=array();
foreach ($myarray as $key=>$val) {
if (isset($seen[$val['uri']])) {
unset($myarray[$key]); // remove duplicate
} else {
$seen[$val['uri']]=$key; // remember this
}
}
unset($seen); // don't need this any more
答案 1 :(得分:3)
我想因为$ selected是一个多维数组,$ selected [0]与$ selected [1]相同,是一个数组。
据我所知,array_unique tests(string)$ value1 ===(string)$ value2,所以你得到'Array'=='Array'。
你还没有真正解释是什么使元素'独特'(URI?)。要比较整个结构,您可能希望尝试循环遍历$ selected,序列化值(使用serialize()),然后对这些值调用array_unique。然后,调用unserialize以使数组恢复正常。
<?php
function multi_array_unique($arr) {
foreach ($arr as &$elm) {
$elm = serialize($elm);
}
$arr = array_unique($arr);
foreach ($arr as &$elm) {
$elm = unserialize($elm);
}
return $arr;
}
?>
这不是最有效的解决方案,但在我担心之前,我会首先进行基准测试。
答案 2 :(得分:2)
array_unique通过比较元素的字符串值来删除重复项。数组的字符串值始终为“Array”,与数组的内容无关。
这意味着数组的所有元素都具有字符串值“Array”,因此被认为是重复的,并且除了第一个之外被删除。
你应该编写自己的array_unique函数,通过比较元素的'uri'来实现。
答案 3 :(得分:0)
如果数组元素已经排序,您可以使用以下方法找到唯一值:
$unique = array();
$n = count($array);
if ($n < 2) {
$unique = $array;
} else {
for ($i=0; $i<$n-1; ++$i) {
$unique[] = $array[$i];
if ($array[$i] === $array[$i+1]) {
++$i;
}
}
if ($i < $n && $array[$n-2] !== $array[$n-1]) {
$unique[] = $array[$n-1];
}
}