2012-09-13 4 views
0

하나에 결합 된 2 개의 배열이 있습니다. 하나의 제품에는 하나의 제품이 있고 다른 하나에는 번호가있는 제품 (제품 수)이 있습니다. 지금까지 너무 좋아배열 키를 섞어서 foreach에 넣습니다.

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

:

$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()는 다음 날이 있습니다. 내가 원하는 것은이 배열을 뒤섞어서 처음 2 x RT542, 1 x 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); 
    } 

그것은 셔플을하지만,하지 무작위 순서로 같은 제품의 이미지 행을 생성합니다

나는 이것을 사용하고 있습니다. 각 제품 키에 최대 제품 수를 보존해야합니다.

해결책 :

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 기능을 통해 발생합니다.

관련 문제