Search code examples
phparraysfor-loopexplodeimplode

What is a better way to replace IDs in an array with their value counterpart?


I have the following array that includes id:

[Key1] => 1
[Key2] => 2, 3

I would like to replace these ids by their respective name from this second array:

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

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

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

The desired output:

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

I have the following code which works but I know this is not the right way. If anybody could let me know what would be a better way to achieve this, it would be greatly appreciated.

What my code looks like:

$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 ;

Solution

  • Just extract the ID and Name into a single-dimension and use it as search and replace parameters. We need to modify the IDs to search for and turn them into a pattern /\b$v\b/ where \b is a word boundary, so that 1 won't replace the 1 in 164 for example:

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