将数组中的ID替换为其对应值的更好方法是什么?

时间:2017-07-31 15:49:19

标签: php arrays for-loop explode implode

我有以下包含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 ;

4 个答案:

答案 0 :(得分: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);

如果您的传入数据始终排序,您可以对此代码进行改进,但我想您的上述示例就是这种情况。

答案 1 :(得分:2)

我有办法做到这一点。如果您希望在以下位置查看,可以尝试一下: - https://eval.in/839823。我使用array_column来映射 key =&gt;值对,然后使用简单的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
)

修改:根据 Josh Maag的评论

  

我的代码只有在Key2中最多只有2个值时才有效。   如果Key3包含&#34; 4,5,6&#34;这段代码将保持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

答案 2 :(得分:2)

只需将IDName提取到一维,然后将其用作搜索和替换参数。我们需要修改ID来搜索并将其转换为/\b$v\b/模式\b,其中1是一个字边界,以便1不会替换164中的$replace = array_column($array2, 'Name', 'ID'); $search = array_map(function($v) { return "/\b$v\b/"; }, array_keys($replace)); $array1 = preg_replace($search, $replace, $array1); 例如:

{{1}}

答案 3 :(得分:0)

应该用于此任务的核心功能是preg_replace_callback()。为什么?因为它是唯一限定在单个函数调用中处理此操作的限定条件。将php函数用于其设计目的似乎是一个悲剧。

超越preg_replace_callback(),只需要array_column()即可将$array2数据准备为简单的查找数组。

代码:(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除外)。

此模式将匹配ID中每个元素的所有完整$array1个数字,并对其进行处理。每个数字匹配都会发送到匿名回调函数,以接收由$lookup数据提供的自定义替换字符串。

作为额外的考虑因素,我在ID中找不到$lookup时包含了星号包裹的替代品。