【发布时间】:2019-02-27 09:30:32
【问题描述】:
我有这个功能
public function saveVariantValue($id, $data, $langs, $field, $client)
{
$transformation = [];
$parts1 = explode(';', $data[$field][1]);
$parts2 = explode(';', $data[$field][2]);
$tmp_arr = array_map(null, $parts1, $parts2);
$transformation[] = array_map(
function($v) { return array_combine(["1","2"], $v); },
$tmp_arr
);
//here i use the transformation array//
}
函数从这个转换输入数组,
[
{
"1": "tag_es1;tag_es2;tag_es3",
"2": "tag_en1;tag_en2;tag_en3"
}
]
到这里
[
{
{
"1" : "tag_es1",
"2" : "tag_en1"
},
{
"1" : "tag_es2",
"2" : "tag_en2"
},
{
"1" : "tag_es3",
"2" : "tag_en3"
}
}
]
每个1 和2 代表数据库中的一个语言ID,如果您检查代码,它只有在我发送两种语言时才有效,但在某些情况下基于用户权限,用户将能够发送
[
{
"1": "tag_es1;tag_es2;tag_es3"
}
]
我想动态地创建代码模式,而不是声明parts1 和parts2,我可以创建一个值字符串,然后像这样评估字符串
$str = '';
$eval = '';
foreach($langs as $l) {
//i create the string "variables", the values of the "parts" must be an array, that's why the explode
$str .= 'parts'.$l->id.'='.serialize(explode(";", $variant[$l->id])).';&';
//i need to pass the "parts" to array_map so i create a string to pass it as the function parameters;
$eval .= '$parts'.$l->id.', ';
}
$str = rtrim($str, '&');
$eval = rtrim($eval, ', ');
parse_str($str);
//if i var_dump $parts1 or $parts2 i get the correct values
$tmp_arr = array_map(null, eval($eval));//here i fail
到目前为止,当我调用 array_map 时,它无法抛出 syntax error, unexpected end of file
所以问题来了,我怎样才能使这段代码工作?这样做可以吗?有没有更好的方法?
【问题讨论】:
-
为什么不检查数组中是否只有一个元素?如果两个 - 做
array_map,否则 - 做别的事情。 -
语言数量可能随时间变化,可能有3、4或n种语言,这样维护起来不太方便
-
什么效率不高?如果一个键 - 做一件事,如果不止一个 - 做
array_map。 -
做
$parts1 = explode(';', $data[$field][1]); $parts2 = explode(';', $data[$field][2]); $parts3 = explode(';', $data[$field][3]); ... $partsN = explode(';', $data[$field][n]);然后$tmp_arr = array_map(null, $parts1, $parts2, $parts3, ... $partsN);是我不想要的
标签: php arrays laravel collections eval