2017-12-06 6 views
0

このサンプルコードは私に頭痛を与えています。私は配列から2つのランダムな値を取得しようとしています。選択された2つのエントリを削除し、すべての要素が選択されるまで続行します。私の問題は、最初の1-2ピックはうまく動作しますが、配列内にない値が選択され、同じ値が2回選択されるということです。コードが2のunset-linesを削除するとOKです... キーの配列を返しますエントリを削除するとPHPのarray_searchが機能しない

<?php 

$number=array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);//range(1,10); 

//var_dump($number)." - ";// 

for ($p = 1; $p <= 5; $p++) { 
    echo "Nr. :".$p."</br>"; 
    echo implode(",",$number)."</br></br>"; 

    $udtrak = array_rand($number,2); // udvælger 2 
    $pos[0] = array_search($udtrak[0], $number); 
    $pos[1] = array_search($udtrak[1], $number); 
    echo "Number: ".$number[$pos[0]]." Found at: " . $pos[0]."</br>"; 
    echo "Number: ".$number[$pos[1]]." Found at: " . $pos[1]."</br>"; 

    //unset($number[$pos[0]]); 
    //unset($number[$pos[1]]); 
    //var_dump($pos);  

$number=array_values($number); 

echo implode(",",$number)."</br></br>"; 
} // for $p 


?> 
+0

あなたの期待される出力の例を表示します。 –

+0

開始時に一度シャッフルしてから、それぞれの反復の前に2つの要素を引き出してみてはどうでしょうか?それでは重複はありません。 – mickmackusa

答えて

1

array_rand() ...私はそれを削除した後、配列のインデックスの再作成についてです信じて、しかしライン「$番号= array_values($番号)は」仕事をする必要があります。 array_search()は値で検索し、値が入力にある場合はキーを返します。

コードスニペットでは$numberのランダムキーが選択され、そのキーと等しい値が検索されます。それはあなたが望むものではありません。

Theresのarray_rand()選択は、単にキーを使用array_searchは必要ありません:あなたは重複の任意のチャンスを表示したくない場合は

$number=array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);//range(1,10); 
for ($p = 1; $p <= 5; $p++) { 
    echo "Nr. :".$p."</br>"; 
    echo implode(",",$number)."</br></br>"; 

    $pos = array_rand($number,2); 
    echo "Number: ".$number[$pos[0]]." Found at: " . $pos[0]."</br>"; 
    echo "Number: ".$number[$pos[1]]." Found at: " . $pos[1]."</br>"; 

    unset($number[$pos[0]]); 
    unset($number[$pos[1]]); 

    $number=array_values($number); 

    echo implode(",",$number)."</br></br>"; 
} // for $p 
+0

こんにちはサイモン。どうもありがとう。私は今夜​​それを試してみましょう。 –

1

、ちょうど開始と出力データから一度配列をシャッフルしますペアで。いいえcountersが必要です。これは配列要素も削除しないので、再度 "downscript"することができます。私のメソッドは、 "自分自身を繰り返さないでください"という原則を採用しており、繰り返しの関数呼び出しをしません(ソート中はそうです)。

コード:(Demo

$numbers=array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);//range(1,10); 
uksort($numbers,function(){return rand()>rand();}); // shuffle and preserve indexes 
//var_export($numbers); 
$pairs=array_chunk($numbers,2,true); // pair the values together (preserving indexes) 
//var_export($pairs); 
foreach($pairs as $pair){ 
    foreach($pair as $index=>$value){ 
     echo "Number: $value Found at: $index\n"; 
    } 
} 

可能な出力:

Number: 2 Found at: 1 
Number: 1 Found at: 0 
Number: 5 Found at: 4 
Number: 3 Found at: 2 
Number: 6 Found at: 5 
Number: 4 Found at: 3 
Number: 7 Found at: 6 
Number: 8 Found at: 7 
Number: 10 Found at: 9 
Number: 9 Found at: 8 

...うーん、おそらくより効率的なソートは次のようになります。

$mid=getrandmax()/2; 
uksort($numbers, function()use($mid){return rand()>$mid;}); // shuffle and preserve indexes 

そして、最後に、あなたがinpを残したいならutを完全に変更せずに、代わりにインデックスの配列をシャッフルします。 (これはおそらく私の最も推奨されるオプションです)

コード:(Demo

$numbers=array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);//range(1,10); 
$indexes=array_keys($numbers); // store indexes as values 
shuffle($indexes); 
$pairs=array_chunk($indexes,2); // group indexes by two 
foreach($pairs as $pair){ 
    foreach($pair as $index){ 
     echo "Number: {$numbers[$index]} Found at: $index\n"; 
    } 
} 
+0

*これは入力配列*を変更/破棄することもありませんが、アイテムの順序が変更されます。 – salathe

+0

@あなたが正しいです、私は編集します。 – mickmackusa

+0

こんにちは - 選択した2つの値の差を配列に設定するゲームをシミュレートしようとしています。したがって、重複した値が後で存在する必要があります... –

関連する問題