1

2 つの配列を結合したいとしましょう。配列の名前は $year_into と $likes_dislikes です。それらは「名前」と呼ばれる鍵を共有します。これを次のようにするにはどうすればよいですか:

$year_info

Array
(
    [0] => Array
        (
            [name] => JOE MONROE
            [year] => 1950
            [info] => his ghost still haunts us
        )
    [1] => Array
        (
            [name] => FUTUREMAN
            [year] => 1930
            [info] => RIP
        )
)

そしてこれは $likes_dislikes

Array
(
    [0] => Array
        (
            [name] => JOE MONROE
            [likes] => cornbread
            [dislikes] => pain
        )
    [1] => Array
        (
            [name] => E. Case
            [likes] => chaos
            [dislikes] => order
        )
    [2] => Array
        (
            [name] => FUTUREMAN
            [likes] => mustard
            [dislikes] => mayo
        )
)

次のような 1 つの配列 $complete に組み合わせることができます。「名前」の値が一致する場合、2 番目の配列の情報が 1 番目の配列に追加されます。

Array
(
    [0] => Array
        (
            [name] => JOE MONROE
            [year] => 1950
            [info] => his ghost still haunts us
            [likes] => cornbread
            [dislikes] => pain
        )
    [1] => Array
        (
            [name] => FUTUREMAN
            [year] => 1930
            [info] => RIP
            [likes] => mustard
            [dislikes] => mayo
        )
)

すでに寄せられた質問に目を通しましたが、何も表示されません。問題を説明するために間違った用語を使用している可能性があります。このように言うと、foreachループで立ち往生しています

foreach ($year_info as $y){
    $complete[]=array('name'=>$y['name'], 'year'=>$y['year'], 'info'=>$y['info'], 'likes'=$likes_dislikes[0]['likes'],'dislikes'=>$likes_dislikes[0]['dislikes'] )
}

すべての好き/嫌いについて同じ値を取得します。これを行う最も簡単な方法は何ですか?

4

4 に答える 4

2

これはクレイジーなワンライナーです(技術的には1行としてカウントされると思います)、それはうまくいくはずです。

$complete = array_map(function($a) use($likes_dislikes){
    foreach($likes_dislikes as $ld){
        if($a['name'] === $ld['name']){
            return $a + $ld;
            break;
        }
    }
}, $year_info);

これは PHP 5.3 以降でのみ機能します。それ以外の場合は、次のように実行できます。

$complete = array();
foreach($year_info as $a){
    foreach($likes_dislikes as $ld){
        if($a['name'] === $ld['name']){
            $complete[] = $a + $ld;
            break;
        }
    }
}
于 2012-04-30T21:26:07.540 に答える
1

私がやろうとしているのは、配列の両方のセットをループして (ネストされた foreach ループが適切な選択です)、名前属性が両方の配列で同じであるインスタンスをチェックすることです。それらが存在する場合、array_merge() を使用してそれらを新しい配列にマージできます。例は次のとおりです。

$newArray = array();
foreach ($arr1 as $first) {
    foreach ($arr2 as $second) {
        if($first["name"] == $second["name"]){
            array_push($newArray, array_merge($first, $second));
        }
    }
}

配列に $arr1 と $arr2 という名前を付けたとします。

于 2012-04-30T21:24:23.000 に答える
1

非常に怠惰な、非常に説明的なアプローチ:

$complete = array();

foreach($year_info as $yr){
  $name = $yr['name'];
  foreach($likes_dislikes as $ld){
    if($ld['name']!=$name){
      continue;
    }else{
      $new_entity = array();
      $new_entity['name'] = $name;
      $new_entity['year'] = $yr['year'];
      $new_entity['info'] = $yr['info'];
      $new_entity['likes'] = $ld['likes'];
      $new_entity['dislikes'] = $ld['dislikes'];
      $complete[] = $new_entity;
      break;
    }
  }
}

これは大きな配列ではパフォーマンスが低下しますが、可能であればデータ構造を変更する方が理にかなっています。単純に名前でキー付けされたデータ構造を持つ方がよいでしょう。入力を制御できますか?

于 2012-04-30T21:22:04.280 に答える
1

両方の配列をループして、3 つ目の配列を作成します。

$complete = array();
foreach ($year_info as $year) {
foreach ($like_dislikes as $like {
if ($year['name'] == $like['name']) {
$complete[] = array_merge($year, $like);
}
}
}
于 2012-04-30T21:23:10.957 に答える