40734

[code]

    $array = array(
      array('name'=>'いちご','id'=>'10'),
      array('id'=>'13'),
      array('name'=>'りんご','id'=>'20'),
      array('id'=>'28'),
      array('name'=>'みかん','id'=>'30'),
      array('name'=>'りんご','id'=>'50'),
      array('name'=>'いちご','id'=>'60'),
    )
    
[/code]

このデータを、nameがないものはそのままで、nameのあるものは、一番最初に出現した同じnameの下にまとめたいとおもっています。

ソート後のイメージとしては、

[code]

    $array = array(
      array('name'=>'いちご','id'=>'10'),
      array('name'=>'いちご','id'=>'60'),
      array('id'=>'13'),
      array('name'=>'りんご','id'=>'20'),
      array('name'=>'りんご','id'=>'50'),
      array('id'=>'28'),
      array('name'=>'みかん','id'=>'30'),
    )
    
[/code]

こういったソートを行う手段をご存知でしたら教えてください。


CC BY-SA 3.0
2018-01-04T05:41:56.697
40708
2018-01-05T06:19:50.423
2018-01-04T23:55:59.360
26875
26875
question
php
二次元配列の値を、値の出現順を変えず、空白は無視してまとめたい


プログラミング言語やライブラリの「ソート」機能は何らかのキーの値に従って順序を並べ替えるものなので、ご自身でちょっとしたコードを書いてやらないといけないだろうと思います。

例えばこんな感じ。

[code]

    <?php
    
    $array = [
      ['name'=>'いちご','id'=>'10'],
      ['id'=>'13'],
      ['name'=>'りんご','id'=>'20'],
      ['id'=>'28'],
      ['name'=>'みかん','id'=>'30'],
      ['name'=>'りんご','id'=>'50'],
      ['name'=>'いちご','id'=>'60'],
    ];
    //'name'の値で分類して、「キー=>配列」の連想配列を作る
    $tmp_arr = [];
    foreach( $array as $element ) {
      if( array_key_exists('name', $element) ) {
        //'name'キーが存在する場合、同じ'name'値の配列の最後に付け足す
        $tmp_arr[$element['name']][] = $element;
      } else {
        //'name'キーが存在しない場合、1要素配列にして$tmp_arrの最後に付け足す
        $tmp_arr[] = [$element];
      }
    }
    var_dump($tmp_arr);
    /*
    `var_dump`の出力は見難いので、省略記法にするとこんな感じになる
    $tmp_arr = [
      'いちご' => [['name'=>'いちご','id'=>'10'], ['name'=>'いちご','id'=>'60']],
      0 => [['id'=>'13']],
      ’りんご' => [['name'=>'りんご','id'=>'20'], ['name'=>'りんご','id'=>'50']],
      1 => [['id'=>'28']],
      'みかん' => [['name'=>'みかん','id'=>'30']],
    ];
     */
    //array_mergeで再度結合
    //phpの配列は連想配列として使っても順序保存されることを利用している
    $array = call_user_func_array('array_merge', $tmp_arr);
    var_dump($array);
    
[/code]

あなたの言い方で言えば三次元配列を中間結果として作成して、それをもう一度つなげなおしています。

(今時5.3以前の古いPHPを使っている人は滅多にいないと思われるので、配列は省略記法にしてあります。)


CC BY-SA 3.0
2018-01-05T03:20:46.640
40734
2018-01-05T05:58:07.477
2018-01-05T05:58:07.477
13972
13972
40708
answer


配列の中で、その配列をidのみのものを最初に抜き出し、その後で元の配列の中から一つのnameをピックアップし、forループをしている時に同じnameがあれば新しい配列にいれて、元の配列からそのnameを含む配列を取り除く。forループし終わった後に、何もnameが見つかっていなければ、新しい配列にあらかじめ用意しておいたidのみの配列を加えるというやり方にしました。

[code]

    <?php
    
    $array       = array(
        array(
            'name' => 'いちご',
            'id' => '10'
        ),
        array(
            'id' => '13'
        ),
        array(
            'name' => 'りんご',
            'id' => '20'
        ),
        array(
            'id' => '28'
        ),
        array(
            'name' => 'みかん',
            'id' => '30'
        ),
        array(
            'name' => 'りんご',
            'id' => '50'
        ),
        array(
            'name' => 'いちご',
            'id' => '60'
        )
    );
    $arraylength = count($array);
    $result      = array();//仮の結果。結果として三次元配列になる。
    $bararray    = array();// idだけの配列を抜き出す。
    
    
    for ($j = 0; $j < $arraylength; $j++) {
        if (array_key_exists('id', $array[$j]) == true && array_key_exists('name', $array[$j]) != true) {
            $newarr       = array();
            $newarr['id'] = $array[$j]['id'];
            array_push($bararray, $newarr);
        }
    }// idのみの配列を抜き出した。
    $j = 0;
    for ($i = 0; $i < $arraylength; $i++) {
    
        $newarr = array();
        for ($k = $i; $k < $arraylength; $k++) {
            if (array_key_exists('id', $array[$i]) == true && array_key_exists('name', $array[$i]) == true && array_key_exists('name', $array[$k]) == true && $array[$k]['name'] == $array[$i]['name']) {
                array_push($newarr, $array[$k]);
                if ($i != $k) {
                    unset($array[$k]);
                    $arraylength--;
                }
                ;
            }
        }
    
        if (!$newarr) {
            array_push($result, $bararray[$j]);
            $j++;
        } else {
            array_push($result, $newarr);
        }
    }//仮の結果、三次元配列はここまで
    
    $realresult   = array();//求めたい結果
    $resultlength = count($result);
    for ($k = 0; $k < $resultlength; $k++) {
        $resultArraylength = count($result[$k]);
        if ($resultArraylength == 1) {
            if (is_array($result[$k]) == true && array_key_exists(0, $result[$k]) == false) {
                array_push($realresult, $result[$k]);
            } else {
                array_push($realresult, $result[$k]['0']);
            }
    
        } else {
            for ($m = 0; $m < $resultArraylength; $m++) {
                array_push($realresult, $result[$k][$m]);
            }
        }
    
    }
    print_r($realresult);
    ?>
    
[/code]


CC BY-SA 3.0
2018-01-05T06:19:50.423
40740
2018-01-05T06:19:50.423
25766
40708
answer