95479


元データ配列  
要素数19

[code]

    $hogeAry = ['111111','222222','333333','444444','555555','666666','77777','888888','9999999','101010','111111','121212','131313','141414','151515','161616','171717','181818','1911919'];
    
[/code]

ランダム並べ替えした結果の例

[code]

    $hogeAry = ['1911919','111111','222222','333333','444444','555555','666666','77777','888888','9999999','101010','111111','121212','131313','141414','151515','161616','171717','181818'];
    
[/code]

今回、取得したい結果。  
重複しないよう、2 つずつ新しい配列へ格納

[code]

    $ary=[['1911919','111111'],['222222','333333'],['444444','555555'],['666666','77777'],['888888','9999999'],['101010','111111'],['121212','131313'],['141414','151515'],['161616','171717']];
    
[/code]

試したコード1(結果が重複することがある)

[code]

    $hogeAry= ['111111','222222','333333','444444','555555','666666','77777','888888','9999999','101010','111111','121212','131313','141414','151515','161616','171717','181818','1911919'];
    shuffle($hogeAry);
    $ary=[];
    $loopNum=intval(count($hogeAry)/2);//9
    for ($i=0;$i<$loopNum;$i++) {
      $ary[$i][0]=$hogeAry[$i];
      $ary[$i][1]=$hogeAry[$i+1];
    }
    print_r($ary);
    
[/code]

試したコード2(取得件数が少ない)

[code]

    $hogeAry= ['111111','222222','333333','444444','555555','666666','77777','888888','9999999','101010','111111','121212','131313','141414','151515','161616','171717','181818','1911919'];
    shuffle($hogeAry);
    $ary=[];
    $loopNum=intval(count($hogeAry)/2);//9
    for ($i=0;$i<$loopNum;$i=$i+2) {
      $ary[$i][0]=$hogeAry[$i];
      $ary[$i][1]=$hogeAry[$i+1];
    }
    print_r($ary);
    
[/code]


CC BY-SA 4.0
2023-07-05T07:28:16.010
95478
2023-07-05T08:49:09.667
7886
question
php
配列から重複なしで2つずつの要素を取り出し、新たな配列に格納したい。2 つない場合は、切り捨て


試したコード1は配列のインデックスに問題があり、コード2はループ回数に問題があります。  
下記のように`for`文を書き換えると取得したい結果が得られます。

[code]

    // ランダム並べ替えした結果の例をそのまま流用
    $hogeAry = ['1911919','111111','222222','333333','444444','555555','666666','77777','888888','9999999','101010','111111','121212','131313','141414','151515','161616','171717','181818'];
    $ary = [];
    
    $loopNum = intval(count($hogeAry) / 2); // 9
    for ($i = 0; $i < $loopNum; $i++) {
        $ary[] = [$hogeAry[$i * 2], $hogeAry[$i * 2 + 1]];
    }
    
    print_r($ary);
    
[/code]


CC BY-SA 4.0
2023-07-05T07:56:20.333
95479
2023-07-05T07:56:20.333
9820
95478
answer


2 個ずつ分けたいだけなら array_chunk() を使うと良いと思います

参考: <https://www.php.net/manual/ja/function.array-chunk.php>

ただし，これだけだと「2つない場合は切り捨て」が実現できず最後の Chunk
は要素1の配列になるため，あまりが出るかどうかは先に考えておくと良いと思います．

[code]

    $inputs = ['111111','222222','333333','444444','555555','666666','77777','888888','9999999','101010','111111','121212','131313','141414','151515','161616','171717','181818','1911919'];
    shuffle($inputs);
    
    // 今回は 2 個ずつに分けます
    $chunkSize = 2;
    
    // 2 個ずつに分けたときにあまりが出るかどうか
    $hasRemainder = count($inputs) % $chunkSize !== 0;
    
    $outputs = array_chunk($inputs, $chunkSize);
    
    // 端数が出るときだけ末尾の要素を削除
    if ($hasRemainder) {
        array_pop($outputs);
    }
    
    
    print_r($outputs);
    
[/code]


CC BY-SA 4.0
2023-07-05T08:49:09.667
95480
2023-07-05T08:49:09.667
58973
95478
answer