我有以下包含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 :(得分: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)
只需将ID
和Name
提取到一维,然后将其用作搜索和替换参数。我们需要修改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
时包含了星号包裹的替代品。