PHP配列のマージの問題

WBOY
リリース: 2016-06-23 13:40:43
オリジナル
882 人が閲覧しました

二次元配列はマージする必要があります

$arr2=array(    "hdzt_show" =>       array (                        "local_date" => "1420128000",            "parent_channel" => "hdzt_show",            "channel" => "hdzt_show",            "speak_uv" => "39",            "speak_amount" => "67"                    ));$arr=array(    "hdzt_show" =>        array(            "local_date" => "1420128000",            "parent_channel" => "hdzt_show",            "channel" => "hdzt_show",            "uv" => "7",            "fuv" => "6",            "valid_user" => "2",            "duration" => "586",            "register" =>"0",            "third_register" => "0",            "pv" => "15"        ));
ログイン後にコピー
この array_merge_recursive を前の local_date に使用すると、parent_channel が繰り返されて配列が生成されます

次の結果が欲しい
$arr=array(    "hdzt_show" =>        array(            "local_date" => "1420128000",            "parent_channel" => "hdzt_show",            "channel" => "hdzt_show",            "uv" => "7",            "fuv" => "6",            "valid_user" => "2",            "duration" => "586",            "register" =>"0",            "third_register" => "0",            "pv" => "15"			"speak_uv" => "39",            "speak_amount" => "67"        ));
ログイン後にコピー
hdzt_show this key と uv これらのキーの数と名前は固定されていません


ディスカッションへの返信 (解決策)

この配列は数千あるため、より高速な方法を使用するようにしてください

2 つの配列が同じサイズで順序が同じ場合、

$arr2=array(    "hdzt_show" =>       array (                         "local_date" => "1420128000",            "parent_channel" => "hdzt_show",            "channel" => "hdzt_show",            "speak_uv" => "39",            "speak_amount" => "67"                     ));$arr=array(    "hdzt_show" =>        array(            "local_date" => "1420128000",            "parent_channel" => "hdzt_show",            "channel" => "hdzt_show",            "uv" => "7",            "fuv" => "6",            "valid_user" => "2",            "duration" => "586",            "register" =>"0",            "third_register" => "0",            "pv" => "15"        ));$r = array_combine(array_keys($arr), array_map('array_merge', $arr, $arr2));var_export($r);
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

を考慮すると2 つの配列のスケールが異なる可能性がある (最初の次元の数が異なる、順序が異なる) 場合、
foreach($arr as $k=>$v) {  if(isset($arr2[$k])) $r[$k] = array_merge($v, $arr2[$k]);}var_export($r);
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
array (  'hdzt_show' =>   array (    'local_date' => '1420128000',    'parent_channel' => 'hdzt_show',    'channel' => 'hdzt_show',    'uv' => '7',    'fuv' => '6',    'valid_user' => '2',    'duration' => '586',    'register' => '0',    'third_register' => '0',    'pv' => '15',    'speak_uv' => '39',    'speak_amount' => '67',  ),)
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

フィールドが繰り返され、最後のものであると仮定すると、どのように対処しますか?が取られ、処理対象の配列がすべて同じキーを持つ 2 次元配列である場合、次のように書くことができます


function merge_arr($arr,$key1=null){	if(!$key1) $key1= key($arr[0]);	$return_arr = array();	foreach($arr as $key=>$val){		foreach($val[$key1] as $k=>$v){			$return_arr[$key1][$k] = $v;		}		}	return $return_arr;}$arr2=array(    "hdzt_show" =>       array (                         "local_date" => "1420128000",            "parent_channel" => "hdzt_show",            "channel" => "hdzt_show",            "speak_uv" => "39",            "speak_amount" => "67"                     ));$arr=array(    "hdzt_show" =>        array(            "local_date" => "1420128000",            "parent_channel" => "hdzt_show",            "channel" => "hdzt_show",            "uv" => "7",            "fuv" => "6",            "valid_user" => "2",            "duration" => "586",            "register" =>"0",            "third_register" => "0",            "pv" => "15"        ));print_r(merge_arr(array($arr2,$arr)));exit;
ログイン後にコピー


結果は次のようになります

Array(    [hdzt_show] => Array        (            [local_date] => 1420128000            [parent_channel] => hdzt_show            [channel] => hdzt_show            [speak_uv] => 39            [speak_amount] => 67            [uv] => 7            [fuv] => 6            [valid_user] => 2            [duration] => 586            [register] => 0            [third_register] => 0            [pv] => 15        ))
ログイン後にコピー

2 つの配列が同じサイズ、同じ順序の場合、

$arr2=array(    "hdzt_show" =>       array (                         "local_date" => "1420128000",            "parent_channel" => "hdzt_show",            "channel" => "hdzt_show",            "speak_uv" => "39",            "speak_amount" => "67"                     ));$arr=array(    "hdzt_show" =>        array(            "local_date" => "1420128000",            "parent_channel" => "hdzt_show",            "channel" => "hdzt_show",            "uv" => "7",            "fuv" => "6",            "valid_user" => "2",            "duration" => "586",            "register" =>"0",            "third_register" => "0",            "pv" => "15"        ));$r = array_combine(array_keys($arr), array_map('array_merge', $arr, $arr2));var_export($r);
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

2 つの配列のスケールが異なる可能性がある (最初の次元の数が異なる、配置順序が異なる) 可能性があることを考慮すると、
foreach($arr as $k=>$v) {  if(isset($arr2[$k])) $r[$k] = array_merge($v, $arr2[$k]);}var_export($r);
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
array (  'hdzt_show' =>   array (    'local_date' => '1420128000',    'parent_channel' => 'hdzt_show',    'channel' => 'hdzt_show',    'uv' => '7',    'fuv' => '6',    'valid_user' => '2',    'duration' => '586',    'register' => '0',    'third_register' => '0',    'pv' => '15',    'speak_uv' => '39',    'speak_amount' => '67',  ),)
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー



これは複数の配列で置き換えることができます。マージするときにそれを実行します


2 つの配列が同じサイズで順序が同じであれば、

$arr2=array(    "hdzt_show" =>       array (                         "local_date" => "1420128000",            "parent_channel" => "hdzt_show",            "channel" => "hdzt_show",            "speak_uv" => "39",            "speak_amount" => "67"                     ));$arr=array(    "hdzt_show" =>        array(            "local_date" => "1420128000",            "parent_channel" => "hdzt_show",            "channel" => "hdzt_show",            "uv" => "7",            "fuv" => "6",            "valid_user" => "2",            "duration" => "586",            "register" =>"0",            "third_register" => "0",            "pv" => "15"        ));$r = array_combine(array_keys($arr), array_map('array_merge', $arr, $arr2));var_export($r);
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

2 つの配列間にスケールの違いがある可能性があることを考慮すると (最初の次元の数が異なり、配置が異なる) order) の場合、
foreach($arr as $k=>$v) {  if(isset($arr2[$k])) $r[$k] = array_merge($v, $arr2[$k]);}var_export($r);
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
array (  'hdzt_show' =>   array (    'local_date' => '1420128000',    'parent_channel' => 'hdzt_show',    'channel' => 'hdzt_show',    'uv' => '7',    'fuv' => '6',    'valid_user' => '2',    'duration' => '586',    'register' => '0',    'third_register' => '0',    'pv' => '15',    'speak_uv' => '39',    'speak_amount' => '67',  ),)
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー



これは、複数の配列をマージすることで置き換えることができます。どのように変更すればよいですか?



すべての配列をパックして渡す方法を参照してください


サイズと順序が同じである場合、

$arr2=array(    "hdzt_show" =>       array (                         "local_date" => "1420128000",            "parent_channel" => "hdzt_show",            "channel" => "hdzt_show",            "speak_uv" => "39",            "speak_amount" => "67"                     ));$arr=array(    "hdzt_show" =>        array(            "local_date" => "1420128000",            "parent_channel" => "hdzt_show",            "channel" => "hdzt_show",            "uv" => "7",            "fuv" => "6",            "valid_user" => "2",            "duration" => "586",            "register" =>"0",            "third_register" => "0",            "pv" => "15"        ));$r = array_combine(array_keys($arr), array_map('array_merge', $arr, $arr2));var_export($r);
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

2 つの配列を考慮した場合、配列にはスケールの違いがある可能性があります (最初の次元の数、配置順序が異なる)、
foreach($arr as $k=>$v) {  if(isset($arr2[$k])) $r[$k] = array_merge($v, $arr2[$k]);}var_export($r);
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
array (  'hdzt_show' =>   array (    'local_date' => '1420128000',    'parent_channel' => 'hdzt_show',    'channel' => 'hdzt_show',    'uv' => '7',    'fuv' => '6',    'valid_user' => '2',    'duration' => '586',    'register' => '0',    'third_register' => '0',    'pv' => '15',    'speak_uv' => '39',    'speak_amount' => '67',  ),)
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー


これは複数の配列で置き換えることができ、それを変更するにはどうすればよいですか?


すべての配列をパッケージ化して渡す方法を参照してください。 。 。あなたがそれを言うとき、私はそれをよく理解していません、私のために投稿してください。また、マージする必要がある配列が何千もあります。

xularge メソッドを使用して、すべての配列を渡すだけで済みます

原理が同じであるため、私の 2 つの foreach の効率は特に遅くはありません

foreach の最初の層は、1,000 を超える配列で処理されますシーケンスの場合、foreach の内部層は各配列の特定の処理です。基本的な考え方は、新しいキーが結果の配列にプッシュされ、古いキーが対応する値に置き換えられることです。最終的な配列にはすべてのキーが含まれます。各キーには値が 1 つだけあります

xularge メソッドを使用してすべての配列を渡すことができます

原則が同じであるため、私の 2 つの foreach の効率は特に遅くなりません

foreach の最初の層は次の処理を行うことですforeach の内部層は、各配列の特定の処理です。基本的な考え方は、新しいキーが結果の配列にプッシュされ、古いキーが対応する値に置き換えられることです。キーと各キーには 1 つの値しかありません

わかりました。3 つの配列を記述する方法を投稿してもらえますか? 私は初心者なので、その方法がわかりません


複数の配列で何が起こっているのか許可されていますか?)

本当にマージする必要がある配列がある場合はマージできます アイデアに問題があるかどうかを検討する必要があります

どうしても後でマージしたい場合は、array_merge_recursive を使用する必要があります
その後、結果を処理します

$arr2=array(    "hdzt_show" =>       array (                          "local_date" => "1420128000",            "parent_channel" => "hdzt_show",            "channel" => "hdzt_show",            "speak_uv" => "39",            "speak_amount" => "67"                      ));$arr=array(    "hdzt_show" =>        array(            "local_date" => "1420128000",            "parent_channel" => "hdzt_show",            "channel" => "hdzt_show",            "uv" => "7",            "fuv" => "6",            "valid_user" => "2",            "duration" => "586",            "register" =>"0",            "third_register" => "0",            "pv" => "15"        ));$r = array_merge_recursive($arr, $arr2);foreach($r as &$t)  foreach($t as &$v) if(is_array($v)) $v = current($v);print_r($r);
ログイン後にコピー
ログイン後にコピー
Array(    [hdzt_show] => Array        (            [local_date] => 1420128000            [parent_channel] => hdzt_show            [channel] => hdzt_show            [uv] => 7            [fuv] => 6            [valid_user] => 2            [duration] => 586            [register] => 0            [third_register] => 0            [pv] => 15            [speak_uv] => 39            [speak_amount] => 67        ))
ログイン後にコピー
ログイン後にコピー


複数の配列 (当たり前だと思われていますか?) で何が起こっているのでしょうか

それが本当に事実である場合 マージする必要がある以前の配列がある場合は、そのアイデアに問題があるかどうかを考慮する必要があります

マージを主張する場合その後、array_merge_recursive を使用する必要があります
それから結果を処理します

$arr2=array(    "hdzt_show" =>       array (                          "local_date" => "1420128000",            "parent_channel" => "hdzt_show",            "channel" => "hdzt_show",            "speak_uv" => "39",            "speak_amount" => "67"                      ));$arr=array(    "hdzt_show" =>        array(            "local_date" => "1420128000",            "parent_channel" => "hdzt_show",            "channel" => "hdzt_show",            "uv" => "7",            "fuv" => "6",            "valid_user" => "2",            "duration" => "586",            "register" =>"0",            "third_register" => "0",            "pv" => "15"        ));$r = array_merge_recursive($arr, $arr2);foreach($r as &$t)  foreach($t as &$v) if(is_array($v)) $v = current($v);print_r($r);
ログイン後にコピー
ログイン後にコピー
Array(    [hdzt_show] => Array        (            [local_date] => 1420128000            [parent_channel] => hdzt_show            [channel] => hdzt_show            [uv] => 7            [fuv] => 6            [valid_user] => 2            [duration] => 586            [register] => 0            [third_register] => 0            [pv] => 15            [speak_uv] => 39            [speak_amount] => 67        ))
ログイン後にコピー
ログイン後にコピー

やっとできました ありがとう ありがとう

上の 2 人の偉い人たち、お疲れ様でした

上の階の偉い人 2 人、お疲れ様でした。

merge_arr(array($arr2,$arr,$arr3,$arr4,$arr5,...,$arr1000) );

どういたしまして。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート