63381


`'xxxx_数字'キー`が複数)あります。数は変動します  
`'b_数字'キー`の数だけ、数字毎に分けて二次元配列へ格納したいです。

**元配列(例)**

[code]

    $a =array (
      'あ' => 'い',
      'b_1' => 'う',
      'b_2' => 'え',
      'c_1' => 'お',
      'c_2' => 'か',
    );
    
[/code]

**期待している結果**

[code]

    $z = array
    (
        [0] => array //キー名サフィックスが_1のものを抽出
            (
                'b' => 'う',
                'c' => 'お',
            )
    
        [1] => array //キー名サフィックスが_2のものを抽出
                'b' => 'え',
                'c' => 'か',
            )
    }
    
[/code]

* * *

**試したコード**  
取り敢えず、`'_1キー'`が含まれる数だけ抽出してみたのですが、期待結果を取得するためにはどうすれば良いですか？

[code]

    array_filter($a, function($key) { 
      return strpos($key, '_1') !== false;
    }, ARRAY_FILTER_USE_KEY);
    
[/code]


CC BY-SA 4.0
2020-02-26T08:11:43.967
63371
2020-02-26T13:44:04.407
2020-02-26T11:36:27.193
7886
7886
question
php
一次元配列のキーのサフィックスを元に、二次元配列を作成したい


`preg_match()` と `array_merge()` を使う場合。

[code]

    $a =array (
      'あ' => 'い',
      'b_1' => 'う',
      'b_2' => 'え',
      'c_1' => 'お',
      'c_2' => 'か',
    );
    
    $z = array();
    foreach ($a as $k => $v) {
      if (preg_match('/^(.+?)_(\d+)$/', $k, $m)) {
        $key = $m[2] - 1;
        if (!array_key_exists($key, $z)) $z[$key] = array();
        $z[$key] = array_merge($z[$key], array($m[1] => $v));
      }
    }
    
    var_dump($z);
    
    =>
    array(2) {
      [0]=>
      array(2) {
        ["b"]=>
        string(3) "う"
        ["c"]=>
        string(3) "お"
      }
      [1]=>
      array(2) {
        ["b"]=>
        string(3) "え"
        ["c"]=>
        string(3) "か"
      }
    }
    
[/code]


CC BY-SA 4.0
2020-02-26T12:47:37.420
63379
2020-02-26T12:47:37.420
63371
answer


はじめまして。別解です。  
難しいのは、preg_match(正規表現)になるかなと思います。  
文字をマッチさせながら構成部品を抽出できるので覚えておくと便利です。  
array_walkでクロージャ使うとすこし今風な書き方ができます。

[code]

    $a =array (
      'あ' => 'い',
      'b_1' => 'う',
      'b_2' => 'え',
      'c_1' => 'お',
      'c_2' => 'か',
    );
    
    $r=[];
    array_walk($a,function($v,$k) use (&$r){
        $m=[];
        $ret = preg_match("/([a-z])_([0-9])$/",$k,$m);
        if($ret){
            $idx_a = $m[1];//1番目にマッチする([a-z])の部分
            $idx_n = (int)$m[2]-1;//2番目にマッチする([0-9])の部分
            if(!isset($r[$idx_n])) $r[$idx_n]=[];
            $r[$idx_n][$idx_a]=$v;
        }
    });  
    
[/code]


CC BY-SA 4.0
2020-02-26T13:44:04.407
63381
2020-02-26T13:44:04.407
37777
63371
answer