分配(传播)数组到每两个值将不同

时间:2014-12-05 16:18:55

标签: php arrays sorting

我需要分配(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);

2 个答案:

答案 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));