39685


2つの配列を組み合わせて、要素同士で部分一致していたら  
あらたに下記のような連想配列を作成したいのですが、うまく行きません。  
考え方やコツ等ありましたらご教授いただけると助かりますので、よろしくお願いいたします。

[code]

    '11' => ['00011', '001122', '1103333']
    '222' => ['002224']
    '3333' => ['033335', '1103333']
    
[/code]

[code]

    $all_data = ['00011' , '001122' , '1103333' , '002224' , '033335'];
    $cd_data = ['11' , '222' , '3333'];
    $output_data = array();
    
    foreach ($cd_data as $cds=>$cd) {
        $same = false;
        $index = 0;
        $all_count = count($all_data);
        foreach($all_data as $data){
            $index++;
            if(strpos($data,$cd) !== false){
                $same = true;
                array_merge($output_data,array($cd=>$data));
                if ($index == $all_count) {
                    var_dump($output_data);
                }
            }else{
                 var_dump("次のidへ");
                 var_dump($output_data);
                 $output_data = array();
                 break;
            }
        }
        var_dump($output_data);
    }
    
[/code]


CC BY-SA 3.0
2017-11-18T19:20:59.963
39683
2017-11-18T23:54:36.760
2017-11-18T23:10:09.630
19110
26257
question
php array
phpで配列の要素同士で部分一致していたら新たな連想配列を作りたい


あなたの元コードを読み解こうと思ったのですが、

  * `$output_data`には最終的な結果の連想配列を入れたいのか、個々の`$cd`の値に対する単純配列を入れたいのかがよくわからない

  * 使いもしていない変数`$cds`, `$same`

  * なぜ`foreach`を使っているのに`$index`や`$all_count`を使う必要があるのかが不明

などの問題があって、どの部分がどう間違っているのかと言うのを指摘していくのが難しいです。

と言うわけで、例と同じ結果を得たいときに、私ならこう書くと言うのを。

`array_filter`を使っても良いならこんな感じ。

[code]

    $all_data = ['00011' , '001122' , '1103333' , '002224' , '033335'];
    $cd_data = ['11' , '222' , '3333'];
    $output_data = [];
    
    foreach ($cd_data as $cd) {
      $output_data[$cd] = array_values(array_filter($all_data, function($data) use($cd) {return strpos($data, $cd) !== false;}));
    }
    
    var_dump($output_data);
    
[/code]

二重ループにしたいならこんな感じ。

[code]

    $output_data = [];
    foreach( $cd_data as $cd ) {
      foreach( $all_data as $data ) {
        if( strpos($data, $cd) !== false ) {
          $output_data[$cd][] = $data;
        }
      }
    }
    
    var_dump($output_data);
    
[/code]


CC BY-SA 3.0
2017-11-18T23:54:36.760
39685
2017-11-18T23:54:36.760
13972
39683
answer