2012-09-13 64 views
0

我有2個陣列,它們被組合成一個。一個陣列有一些產品,另一個陣列有數字(產品數量)。洗牌數組的鍵,然後混合在的foreach

$brick = "RT542,RT543,RT538"; 
$ratio = "10,15,13"; 

$bricks = explode(",", $brick); 
$ratios = explode(",", $ratio); 
$bricks_and_ratio = array_combine($bricks, $ratios); 

Array ( 
    [0] => RT542 
    [1] => RT543 
    [2] => RT538 
) 

Array ( 
    [0] => 10 
    [1] => 15 
    [2] => 13 
) 

array_combine(),然後給了我這樣的:

Array ( 
[RT542] => 10 
[RT543] => 15 
[RT538] => 13 
) 

到目前爲止好。我要的是重新洗牌以這樣一種方式這陣,我會得到一排第一2×RT542然後1個RT538然後3X RT543等等等等,直至項目的最大數量。

我使用這個:

function BuildCustomBricks($myBricksAndRatios) { 

     $img = imagecreate(890,502); 
     imagealphablending($img, true); 
     imagesavealpha($img, true); 

     $keys = array_keys($myBricksAndRatios); 
     shuffle($keys); 
     $random = array(); 

     foreach ($keys as $key) { 

      $random[$key] = $myBricksAndRatios[$key]; 

      for($i = 1; $i <= $myBricksAndRatios[$key]; $i++) { 
       $cur = imagecreatefrompng("/var/www/brickmixer/bricks/". $key."-$i.png"); 
       imagealphablending($cur, true); 
       imagesavealpha($cur, true);      

       imagecopy($img, $cur, -150+$i*132, 0, 0, 0, 125, 32);             
      } 

      imagedestroy($cur); 
     } 

     header('Content-Type: image/png'); 
     imagepng($img); 
    } 

它做的洗牌,但它創建相同的產品,而不是按隨機順序的圖像的一行。 我需要保留每個產品密鑰的最大產品數量。

SOLUTION:

function shuffle_bricks($array) {   
     foreach($array as $key => $value) { 
      for($i = 1; $i <= $value; $i++) { 
       $new_array[] = $key;     
      } 
     }  

     shuffle($new_array);   
     return $new_array; 
    } 
+0

使用'array_fill' – diEcho

+0

你可以給你所期望的的var_dump或print_r的例子嗎? –

+0

我所期待的輸出,其中磚(產品)隨機混合。 比方說,我有10個不同的彩色磚,其中每個磚的輸出爲10.最終圖像將包含隨機混合的不同顏色的100塊磚。使用上面的功能,它將打印同一產品的10個磚塊,下一個磚塊的10個磚塊等等。儘管如此,它會是隨機的,哪種產品最先出現 –

回答

1

沒有測試過這一點,但它應該讓你在正確的軌道上:

<?php 
function shufflebricks($bricks) { 
    $rs = array(); 
    while (count($bricks) >= 0) { 
    $key = array_rand($bricks, 1); 
    $bricks[$key]--; // Use one brick 
    $rs[] = $key; // Add it to output 
    if ($bricks[$key] <= 0) unset($bricks[$key]); // Remove if there's no more of this brick 
    } 
    return $rs; 
} 
?> 

它使用一磚一瓦的時間從一個隨機磚類型剩下磚塊了。如果您想一次使用塊,請在其中添加一個$quantity = rand(1, $bricks[$key]);

+0

這似乎是工作...可能需要一些調整,但它指出我在正確的方向! :) 非常感謝你! –

0

如果使用索引陣列,確保標準化指標,以及:

function shuffleArray($source) { 
    $target = array(); 
    for($i = count($source); $i > 0; $i--) { 
     $key = rand(0, $i - 1); 
     $target[] = $source[$key]; 
     unset($source[$key]); 
     $source = array_values($source); 
    } 
    return $target; 
} 

恰巧經過array_values功能。