试图用PHP操作数组

时间:2015-01-16 19:44:44

标签: php mysql

我不想问,但我仍然是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。

提前感谢你的帮助。

6 个答案:

答案 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);

如您所见,不涉及循环。

我希望它有所帮助

修改

以下是可视化正则表达式的链接