2014-12-05 48 views
0

我需要分配(傳播/採取輪)陣列每兩個值不同分配(擴)陣列每兩個值不同

例如

array('cat','cat','cat','cat','dog','cat','cat','apple','mouse') 

我需要得到的東西像

array('cat','dog','cat','apple','cat','mouse','cat','cat','cat') 

如果最後一個元素是相同的=我有三個'貓'在數組的末尾我需要刪除它並將其提取到其他數組中。

而且需要儘可能少的刪除元素。

哪種方法可以在PHP中實現?謝謝。

此數組可以有任何值。任何值的計數。有不止一個重複的詞:五次'貓',十次'狗',兩次'la-la-la'等等。 我需要它分配給

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

你有什麼tryed這麼遠嗎?向我們展示您的研究幫助每個人 – 2014-12-05 16:22:14

+0

如果有多個重複單詞,會發生什麼情況,例如:數組('貓','貓','貓','貓','狗','狗','狗」, '貓', '貓', '蘋果', '鼠標');'?這是一個有效的場景嗎? – ymas 2014-12-05 16:53:40

+0

謝謝。往上看。是的,有不止一個重複單詞。 – user3679891 2014-12-05 17:00:00

回答

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)); 
+0

是的。謝謝。我添加了我的半工作解決方案。但是你的解決方案的工作 – user3679891 2014-12-05 18:56:22

+0

你好。我爲二維數組添加了我的變體(對於每個內部元素中的第二個元素)。我是否以某種方式將您的解決方案應用於二維數組?謝謝。 – user3679891 2014-12-06 16:40:57

+0

Hello @ user3679891,是的,你可以使用這個新的函數來生成二維數組。 – 2014-12-06 18:04:23

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 
) 
+0

謝謝。但是如果我有很多'貓'和'狗'。我會嘗試使用IN運算符之類的東西。我的任務是(編號從1開始可讀)elem1和elem2將會不同,elem3和elem4將會不同,等等。現在我試着用它來做。 – user3679891 2014-12-05 16:53:40

+0

更新了我的帖子。希望它能幫助你! – MH2K9 2014-12-05 16:59:51