我不想问,但我仍然是PHP的新手而且我被卡住了。
我有一个以逗号分隔的列表存储在MySQL中;蓝色,12,红色,15等 我可以把它拿出来并做我想做的大部分工作,但我很困惑如何继续。 最后,我想从
更改数据的输出 Blue, 12, Red, 15,
到
Blue => 12, Red => 15
(没有最后一个逗号)所以我可以使用我正在尝试构建的程序中的数据。
目前,我能够实现:
Blue, => 12, => Red, => 15,
代码:
$result = $con->query($sql);
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
$id = $row['id'];
$type = $row["dataname"];
$datas = $type;
eval( "\$test = array (" . $datas . ");") ;
foreach($test as $test)
{
echo "<option name='$test'>$test , =></option>";
}
}
}
使用所需的输出,我将能够从表单输入数据以创建SVGGraph。
提前感谢你的帮助。
答案 0 :(得分:2)
好的,首先,我会尝试将此信息存储在未来的单独行中,逗号分隔列表适用于我们没有数据库的情况(例如简单的文本文件)。
但要回答你的问题(假设结果是分隔值的字符串):
$result = explode(',', $result);
$output = [];
for($i = 0;$i < count($result);$i=$i+2){
array_push($output, $result[i] => $result[i+1]);
}
//output:
$str = ""
foreach($output as $key => $value){
str .= $key . ' => ' . $value . ' ,';
}
$str = rtrim($str, ',');
echo $str //this will be your output
答案 1 :(得分:1)
使用eval是最糟糕的。
以下是我在尽可能保持代码的同时做到这一点:
$result = $con->query($sql);
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
$id = $row['id'];
$type = $row["dataname"];
$datas = $type;
$res = array();
$arr = explode(",", str_replace(" ","",$datas));
for ($i = 0; $i < count($arr); $i+=2) {
$res[$arr[$i]] = $arr[$i + 1];
}
foreach($res as $key=>$value)
{
echo "<option name='$value'>$key , =></option>";
}
}
}
答案 2 :(得分:0)
首先,尝试不要使用eval - it is dangerous。:)
其次,尝试将所需的所有数据放入一个大字符串中。然后,您可以使用explode PHP函数将字符串转换为单个元素。你要做的最后一件事就是简单地遍历数组并将第一项作为键,将第二项作为元素分配到另一个数组中。
我会将实际的实现留给您作为PHP编码技能的练习。:)
答案 3 :(得分:0)
请不要使用eval。你几乎总能避免它并且很危险。 这是一个没有eval的解决方案:
$result = $con->query($sql);
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
$id = $row['id'];
$type = $row["dataname"]; // Thats our comma-seperated list, right?
$arr = explode(',', $type); // Make $type to array
array_pop($arr); // Delete last element because its empty
// We go through the array with step = 2
// because the first is always the key and the second the value
for($i = 0; $i < count($arr); $i += 2)
{
echo "<option name='$arr[$i+1]'>$arr[$i] , =></option>";
}
}
}
为什么eval是邪恶的 无论字符串中的内容是什么,都会被作为脚本中包含文件访问权限等所有权限的代码进行规避。由于eval的字符串来自数据库,因此您甚至无法确定使用eval时执行的代码是否正常。 此外,在调试时,eval很糟糕。 最后:为什么要用可以避免的东西来产生开销呢? 由于所有这些原因,使用eval时通常认为它是坏的样式。更好,你永远不会习惯它
答案 4 :(得分:0)
//trim comma from the right
$str = rtrim('Blue, 12, Red, 15,', ',');
//create a helper array
$array = explode(', ', $str);
//arrange elements in the new array
for ($i = 0; $i < count($array) - 1; $i = $i + 2) {
$new[] = $array[$i] . ' => ' . $array[$i + 1];
}
//output new elements
echo implode(', ', $new);
答案 5 :(得分:0)
如果我理解正确,你从一个字符串到一个数组到一个字符串。 如果是这样,可以使用正则表达式跳过该数组。根据字符串的长度,创建一个巨大的数组可能是个问题。
所以我提出了这些例子:
$input = "Blue, 1, Red, 2, Green, 3, Violet, 4,";
// Output: Blue => 1, Red => 2, Green => 3, Violet => 4
echo rtrim(preg_replace('/(([^,]*),([^,]*)),+/', '\2 =>\3,', $input), ',');
// Output <option name="Blue">Blue => 1</option><option name="Red">Red => 2</option><option name="Green">Green => 3</option><option name="Violet">Violet => 4</option>
echo preg_replace('/(\s*([^,]*)\s*,\s*([^,]*)\s*),+/', '<option name="\2">\2 => \3</option>', $input);
如您所见,不涉及循环。
我希望它有所帮助
修改强>
以下是可视化正则表达式的链接