0

1 つに結合された 2 つの配列があります。1 つの配列にはいくつかの製品があり、もう 1 つの配列には数字 (製品の数) があります。

$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 x RT542、次に 1 x RT538、次に 3 x 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);
    }  

シャッフルしますが、ランダムな順序ではなく、同じ製品の画像の行を作成します。各プロダクト キーに最大数の製品を保持する必要があります。

解決:

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

        shuffle($new_array);        
        return $new_array;
    }
4

2 に答える 2

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;
}
?>

これは、レンガが残っているランダムなレンガ タイプから一度に 1 つのレンガを使用します。一度にチャンクを使用する場合は、そこに a を追加$quantity = rand(1, $bricks[$key]);します。

于 2012-09-13T11:49:41.953 に答える
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ます。

于 2014-01-06T16:45:38.100 に答える