有没有好的或标准的方法呢?
采用以下示例:
$values = array(
'blue'
, 'blue'
, 'blue'
, 'blue'
, 'green'
, 'red'
, 'yellow'
, 'yellow'
, 'purple'
, 'purple'
, 'purple'
);
我需要它被分开,所以没有两个相同的值接触(除非没有可能的解决方案 - 在这种情况下,要么产生错误,要么返回false或其他任何东西都是可接受的。)
这是上面的数组(手工完成),但我是如何改变它的:
$values = array(
'blue'
, 'purple'
, 'green'
, 'purple'
, 'blue'
, 'red'
, 'blue'
, 'yellow'
, 'blue'
, 'yellow'
, 'purple'
)
这些值在开始时不一定是有序的 - 这只是为了简单起见。
有什么想法吗?任何让我开始正确方向的代码?
答案 0 :(得分:4)
这个功能可以解决问题:
function uniq_sort($arr){
if(!count($arr))
return array();
$counts = array_count_values($arr);
arsort($counts);
while(NULL !== ($key = key($counts)) && $counts[$key]){
if(isset($prev) && $prev == $key){
next($counts);
$key = key($counts);
if($key === NULL)
return false;
}
$prev = $result[] = $key;
$counts[$key]--;
if(!$counts[$key])
unset($counts[$key]);
arsort($counts);
reset($counts);
}
return $result;
}
使用示例:
$values = array('blue', 'blue', 'blue', 'blue', 'green', 'red', 'yellow', 'yellow', 'purple', 'purple', 'purple');
print_r(uniq_sort($values));
$values = array('a', 'b', 'b');
print_r(uniq_sort($values));
$values = array(1);
print_r(uniq_sort($values));
$values = array(1, 1, 1, 1, 2, 3, 4);
print_r(uniq_sort($values));
$values = array(1, 1, 1, 1, 2, 3);
var_dump(uniq_sort($values));
输出:
Array
(
[0] => blue
[1] => purple
[2] => blue
[3] => yellow
[4] => blue
[5] => purple
[6] => blue
[7] => purple
[8] => red
[9] => yellow
[10] => green
)
Array
(
[0] => b
[1] => a
[2] => b
)
Array
(
[0] => 1
)
Array
(
[0] => 1
[1] => 3
[2] => 1
[3] => 4
[4] => 1
[5] => 2
[6] => 1
)
bool(false)
答案 1 :(得分:1)
$values = array(
'blue'
, 'blue'
, 'blue'
, 'blue'
, 'green'
, 'red'
, 'yellow'
, 'yellow'
, 'purple'
, 'purple'
, 'purple'
);
$value_count = Array();
foreach($values as $v){
if(isset($value_count[$v])){
$value_count[$v]++;
}else{
$value_count[$v] = 1;
}
}
unset($v);
//Now generate new array
$result = Array();//This line is technically not necessary
$done = false;
while(!$done){
$done = true;
foreach($value_count as $k => &$c){
if($c > 0){
$result[] = $k;
$c--;
$done = false;
}
}
}
print_r($result);
结果如下:
Array
(
[0] => blue
[1] => green
[2] => red
[3] => yellow
[4] => purple
[5] => blue
[6] => yellow
[7] => purple
[8] => blue
[9] => purple
[10] => blue
)
答案 2 :(得分:1)
逻辑:
打印第一个值,然后打印下一个值,将其与前一个值进行比较,如果它们相同,则跳过下一个,依此类推。
答案 3 :(得分:0)
走下阵列,记住你看到的最后一个值,如果它匹配,扔掉你正在看的那个。 Here's an example:
$values = array(
'blue'
, 'blue'
, 'blue'
, 'blue'
, 'green'
, 'red'
, 'yellow'
, 'yellow'
, 'purple'
, 'purple'
, 'purple'
);
$last_seen_value = NULL;
foreach ($values as $i => $value) {
if (0 == strcmp($value, $last_seen_value)) {
unset($values[$i]);
} else {
$last_seen_value = $value;
}
}
print_r($values);
# Output:
#
# Array
# (
# [0] => blue
# [4] => green
# [5] => red
# [6] => yellow
# [8] => purple
# )