我需要分配(spread / take round)数组,每两个值都不同
例如
array('cat','cat','cat','cat','dog','cat','cat','apple','mouse')
我需要得到像
这样的东西array('cat','dog','cat','apple','cat','mouse','cat','cat','cat')
如果最后一个元素是相同的=我在数组的末尾有三个'cat'我需要删除它并在其他数组中提取它。
并且需要尽可能少地删除元素。
在PHP中使用哪种方法最好?感谢。
此数组可以包含任何值。任何值的计数。有不止一个重复的词:五次'猫',十次'狗',两次'拉拉'等等。 我需要将它分配给
elem1 != elem2
elem3 != elem4
elem5 != elem6
elem7 != elem8
如果将遗留值并且我无法以这种方式分配它,我需要删除它并显示这些值(我知道剩下多少和哪些值)。
我使用shuffle PHP函数的解决方案:
$source = array('cat','cat','cat','cat','dog','cat','cat','cat','apple','apple','apple','apple','apple','apple','apple','apple','apple','apple','cat','cat','cat','cat','cat','cat','cat','mouse');
while ( !empty( $source ) ){
while ($source[ 0 ] == $source[ 1 ]) {
shuffle( $source ); // it's ruefully
$arr_contains_same_value = false;
for($i=1; $i<count($source);$i++) {
if ($source[0] != $source[$i]){
$arr_contains_same_value = true;
break;
}
}
if ($arr_contains_same_value == false){ break 2; }
}
if (count($source) == 1) break ;
print $source[0]."\n";
print $source[1]."\n";
unset( $source[ 0 ], $source[ 1 ] );
$source = array_values($source);
}
print "Was left:";
var_dump($source);
对于二维数组:
$source = array(
array("help people", "cat"),
array("force", "tiger"),
array("Tom", "cat"),
array("black", "cat"),
array("Jerry", "mouse"),
array("UNIX", "cat"),
array("young", "lion"),
array("angry", "dog"),
array("kind", "dog")
);
while ( !empty( $source ) ){
while ($source[ 0 ][1] == $source[ 1 ][1]) {
shuffle( $source ); // it's ruefully
$arr_contains_same_value = false;
for($i=1; $i<count($source);$i++) {
if ($source[0][1] != $source[$i][1]){
$arr_contains_same_value = true;
break;
}
}
if ($arr_contains_same_value == false){ break 2; }
}
if (count($source) == 1) break;
print $source[0][1]."\n";
print $source[1][1]."\n";
unset( $source[ 0 ], $source[ 1 ] );
$source = array_values($source);
}
print "Was left:\n\n";
var_dump($source);
答案 0 :(得分:0)
您可以尝试以下内容
$arr = array('cat','cat','cat','cat','dog','cat','cat','apple','mouse');
$final_arr = array(); $limit = count($arr);
$temp = array_values(array_filter(array_map(function($v){if($v != 'cat') return $v;}, $arr)));
for($i = 0, $j = 0; $i < $limit; $i++){
if(isset($temp[$j])){
$final_arr[] = 'cat';
$final_arr[] = $temp[$j];
$i++; $j++;
}else{
$final_arr[] = 'cat';
}
}
print '<pre>';
print_r($final_arr);
print '</pre>';
<强>输出:强>
Array
(
[0] => cat
[1] => dog
[2] => cat
[3] => apple
[4] => cat
[5] => mouse
[6] => cat
[7] => cat
[8] => cat
)
答案 1 :(得分:0)
您可以使用此功能解决您的问题, 在此函数中,第一次检查值的计数,以便以最佳方式对项目进行排序。
$items = array('cat','cat','cat','cat','cat','apple', 'dog', 'dog','cat','cat','apple','mouse');
function mySort($items){
$map = array_count_values($items);
arsort($map);
$result = array();
for ($i=0; $i < count($items); $i++) {
foreach ($map as $key => $value) {
//print_r($result);
if($value <= 0 || $key == end($result)) continue;
$result[] = $key;
if(--$map[$key] <= 0) unset($map[$key]);
break;
}
arsort($map);
}
if(!empty($map))
$result = array_merge($result, array_fill(0, end($map), key($map)));
return $result;
}
print_r(mySort($items));
<强>输出:强>
Array
(
[0] => cat
[1] => apple
[2] => cat
[3] => dog
[4] => cat
[5] => apple
[6] => cat
[7] => mouse
[8] => cat
[9] => dog
[10] => cat
[11] => cat
)
对于二维数组,您可以使用此功能:
function myarsort(&$items){
uasort($items, function($a, $b){
return (count($a) > count($b)) ? -1 : 1;
});
}
function mySort2($items){
$map = array();
foreach ($items as $item) {
$map[$item[1]][] = $item;
}
myarsort($map);
$result = array();
for ($i=0; $i < count($items); $i++) {
foreach ($map as $key => $value) {
if(isset(end($result)[1]) && $key == end($result)[1]) continue;
$result[] = end($value);
unset($map[$key][count($value)-1]);
if(count($map[$key]) == 0) unset($map[$key]);
break;
}
myarsort($map);
}
if(!empty($map))
$result = array_merge($result, end($map));
return $result;
}
print_r(mySort2($items2));