2017-07-31 6 views
1

私は、次の配列を有するID:配列のIDを値の対応するものと置き換えるより良い方法はありますか?

[Key1] => 1 
[Key2] => 2, 3 
私はこの二番目の配列からのそれぞれの名前でこれらのIDを交換したい

[0] => Array 
    (
     [ID] => 1 
     [Name] => Name1 
    ) 

[1] => Array 
    (
     [ID] => 2 
     [Name] => Name2 
    ) 

[2] => Array 
    (
     [ID] => 3 
     [Name] => Name3 

所望の出力:

[Key1] => Name1 
[Key2] => Name2, Name3 

私は以下のコードを使用していますが、これは正しい方法ではないことが分かります。誰かが私にこれを達成するためのよりよい方法を教えてもらえれば、それは非常に感謝しています。あなたが巣にいくつかのループを必要とする

$var1 = explode(", ", $array1["Key1"]); // No need to explode in this example but "Key1" sometimes includes more than 1 ID 
$var2 = explode(", ", $array1["Key2"]); 

$array1["Key1"] = $var1 ; // This row is for the new array generated from "explode" to be a sub-array 
$array1["Key2"] = $var2 ; // Same 

for ($i = 0; $i < 83; $i++){ 
    if($array1["Key1"][0] == $array2[$i]["ID"]){ 
     $array1["Key1"][0] = $array2[$i]["Name"]; 
    } 
    if($array1["Key1"][1] == $array2[$i]["ID"]){ 
     $array1["Key1"][1] = $array2[$i]["Name"]; 
    } 
// (etc) 
    if($array1["Key2"][0] == $array2[$i]["ID"]){ 
     $array1["Key2"][0] = $array2[$i]["Name"]; 
    } 
    if($array1["Key2"][1] == $array2[$i]["ID"]){ 
     $array1["Key2"][1] = $array2[$i]["Name"]; 
    } 
// (etc) 

} 

$var1 = implode(", ", $array1["Key1"]); 
$var2 = implode(", ", $array1["Key2"]); 

$array1["Key1"] = $var1 ; 
$array1["Key2"] = $var2 ; 
+0

Adrienは以下の答えを確認します。 –

+0

うわー!誰かがすべての答えを嫌う。 – AbraCadaver

+0

誰かが何の説明もせずにすべての答えを下落させたのは不思議です。私の質問に答える時間をとった皆さん、ありがとう、私は今夜テストをします:) – Adrien

答えて

2

ただ、単一次元にIDNameを抽出し、検索としてそれを使用してパラメータの交換を参照してください。私たちは、検索および1は、例えば1641を置き換えないように、\bはワード境界でパターン/\b$v\b/にそれらを回すためにID Sを変更する必要があります

$replace = array_column($array2, 'Name', 'ID'); 
$search = array_map(function($v) { return "/\b$v\b/"; }, array_keys($replace)); 

$array1 = preg_replace($search, $replace, $array1); 
+0

私はあなたのアイデアAbraCadaverが本当に好きですが、私はそれに小さな問題を抱えています。たとえば、IDとして「164」がある場合、IDとして「1」が識別され、名前で置き換えられます.6,4または64は私のリストのIDではないので、最後に64を残します。したがって、ID164が存在するにもかかわらず、ID164は、番号64に続くID1に対応する名前に置き換えられる。どのようにこれを修正するための任意のアイデア? – Adrien

+0

良いキャッチ。私は 'preg_replace'と単語の境界を探すパターンで修正しました。 – AbraCadaver

+0

これは今、魅力のように動作します、ありがとうございます;)! – Adrien

2

:のように私のコードが見える何

。ここでは動作するはずですsample

//Processing Array 
$arrayOne = array(
    "Key1" => "1", 
    "Key2" => "2, 3"); 

//Lookup Array 
$arrayTwo = array(
    array(
     "ID" => "1", 
     "Name" => "Name1"), 
    array(
     "ID" => "2", 
     "Name" => "Name2"), 
    array(
     "ID" => "3", 
     "Name" => "Name3")); 

var_dump($arrayOne); 

//Loop through all values in our original array 
foreach($arrayOne as &$arrValue) { 
    //Split the value in the original array into another temporary array 
    //if there are multiple values. 
    $valueArray = explode(", ", $arrValue); 
    $outputArray = array(); 
    foreach($valueArray as &$myValue) { 
     //Now do a lookup to replace each value 
     foreach($arrayTwo as &$lookupValue) { 
      //Find a match 
      if($myValue==$lookupValue["ID"]) { 
       $myValue = $lookupValue["Name"]; 
       //We found the value we want, so let's break out of this loop 
       break; 
      } 
     } 
     //Append the value 
     array_push($outputArray, $myValue); 
    } 
    //Convert back to string 
    $arrValue= implode(", ", $outputArray); 
} 

var_dump($arrayOne); 

あり、あなたの着信データは常にソートされた場合は、おそらくこのコードを作ることができるの改善がありますが、私はそれが上記のあなたのサンプルのためだけの場合であると想像します。

2

私はこれを行う方法があります。ここで見たい場合は、 - https://eval.in/839823を試してみてください。私は、を使用してキー=>値のペアをマップし、次に簡単にforeachを使用しています。

<?php 
$main = ['Key1' => 1,'Key2' => '2, 3']; 

$match = [ 
    [ 
     'ID' => 1, 
     'Name' => 'Name1' 
    ], 

    [ 
     'ID' => 2, 
     'Name' => 'Name2' 
    ], 
    [ 
     'ID' => 3, 
     'Name' => 'Name3' 
    ] 
]; 

$final_array=[]; 
$mapped = array_column($match, 'Name', 'ID'); 
foreach($main as $k=>$v){ 
    $r = explode(',',$v); 
    if(count($r)>1){ 
     $final_array[$k] = $mapped[$r[0]]. ", ".$mapped[intval($r[1])]; 
    }else{ 
     $final_array[$k] = $mapped[$r[0]]; 
    } 
}  
print '<pre>'; 
//print_r($mapped); 
print_r($final_array); 
print '</pre>'; 

は出力:

Array 
(
    [Key1] => Name1 
    [Key2] => Name2,Name3 
) 

編集:彼は唯一の2つの値の最大値を持っている場合ジョシュマーグ

のコメントを1として私のコードにのみ機能しますKey2。 Key3に "4,5,6"が含まれている場合、このコードは6をそのまま残します。

<?php 


$main = ['Key1' => 1,'Key2' => '2,3','Key3' => '4,5,6']; 

    $match = [ 
     [ 
      'ID' => 1, 
      'Name' => 'Name1' 
     ], 

     [ 
      'ID' => 2, 
      'Name' => 'Name2' 
     ], 
     [ 
      'ID' => 3, 
      'Name' => 'Name3' 
     ], 
     [ 
      'ID' => 4, 
      'Name' => 'Name4' 
     ], 
     [ 
      'ID' => 5, 
      'Name' => 'Name5' 
     ], 
     [ 
      'ID' => 6, 
      'Name' => 'Name6' 
     ] 
    ]; 

    $final_array=[]; 
    $mapped = array_column($match, 'Name', 'ID'); 
    foreach($main as $k=>$v){ 
     $r = explode(',',$v); 
     if(count($r)>1){ 
      $final_array[$k] = implode(',',array_map(function($key) use ($mapped){ return $mapped[$key]; }, array_values($r))); 
     }else{ 
      $final_array[$k] = $mapped[$r[0]]; 
     } 
    }  

    print '<pre>'; 
    print_r($mapped); 
    print_r($final_array); 
    print '</pre>'; 
    ?> 

参照のデモはここhttps://eval.in/839939

+0

晴れているので、ソリューションはKey2に最大2つの値しかない場合にのみ機能します。 Key3に "4,5,6"が含まれている場合、このコードは6をそのまま残します。 –

+0

@JoshMaag私の編集で見てください:) –

0

そのはずコア機能このタスクに使用されるのはpreg_replace_callback()です。どうして?これは、単一の関数呼び出しでこの操作を処理するための一意的な資格があるためです。彼らの設計目的のためにPHP関数を使用しないことは悲劇のようです。

preg_replace_callback()を超えて、単純な検索配列として$array2データを準備するには、array_column()のみが必要です。

コード:(Demo

$array1=["Key1"=>"1","Key2"=>"22, 4, 123"]; 
$array2=[["ID"=>"1","Name"=>"Name1"],["ID"=>"22","Name"=>"Name22"],["ID"=>"123","Name"=>"Name123"]]; 
$lookup=array_column($array2,'Name','ID'); // generate array: keys = IDs, vals = Names 

$result=preg_replace_callback('/\d+/',function($m)use($lookup){return isset($lookup[$m[0]])?$lookup[$m[0]]:"*{$m[0]}*";},$array1); 
var_export($result); 

出力:

array (
    'Key1' => 'Name1', 
    'Key2' => 'Name22, **4**, Name123', 
) 

追加のループまたは関数呼び出しを使用して($lookupを除く)すべての準備を実行する必要はありません。

このパターンは、$array1の各要素のすべての完全なIDの番号と一致し、それらを個別に処理します。各数値一致は、匿名コールバック関数に送信され、$lookupデータで配信されたカスタマイズされた置換文字列を受け取ります。

さらに、IDが見つからない場合は、アスタリスクで囲まれた置き換えを含めました($lookup)。

+0

@Adrienもし私がそれが他のすべての回答の優れた方法であると絶対に確信していなければ、私はこの遅い投稿をするのに気にかけていませんでした。私の 'preg_replace_callback()'は、あなた(そして将来のすべての読者)がこのタスクに使うべきアプローチです。この機能について質問がある場合は、私に尋ねてください。 – mickmackusa

関連する問題