Concrete-Cowboy
Concrete-Cowboy

Reputation: 87

Trying to manipulate an array with PHP

I did not want to ask, but I am still quite new to PHP and I am stuck.

I have a comma separated list stored in MySQL; Blue, 12, Red, 15 etc. I can bring it out and do most of what I want, but I am confused on how to proceed. Ultimately, I would like to change the output of the data from

Blue, 12, Red, 15,

to

Blue => 12, Red => 15 (without the last comma) So I can use the data in a program I am attempting to build.

Currently, I am able to achieve: Blue, => 12, => Red, => 15,

Code:

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

Using the desired output, I will be able to input data from a form to create an SVGGraph.

Thank you in advance for any assistance.

Upvotes: 2

Views: 129

Answers (6)

A.D.
A.D.

Reputation: 1180

If I understand correctly, you go from a string to an array to a string. If so, it is possible to skip the array by using regex. Depending on the length of your string, creating a huge array may be a problem.

So I came up with those examples:

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

As you can see, no looping involved.

I hope it helped

EDIT

Here is links to visualize the regex

Upvotes: 0

Fuzzyma
Fuzzyma

Reputation: 8484

Please dont use eval. You nearly always can avoid it and is dangerous. Here is a solution which works without 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>";
        }
    }
}

Why eval is evil: Whatever is in the string is evaled as code from your script with all rights the script has incuding file-access and so on. Since the string for your eval comes from the database you cant even be absolutely sure that it is no bad code you are executing when using eval. Furthermore eval is bad when it comes to debugging things. And at the end: Why producing overhead with stuff you can avoid? It is in general recognized as bad style when using eval because of all this reasons. Better you never get used to it

Upvotes: 0

mcdonaldjosh
mcdonaldjosh

Reputation: 119

Ok so first off, I would try storing this information in separate rows in the future, comma separated lists are for when we do not have databases (simple text files for example).

But to answer your question (assuming result is the string of separated values):

$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

Upvotes: 2

Weltschmerz
Weltschmerz

Reputation: 2186

//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);

Upvotes: 0

Robert Rossmann
Robert Rossmann

Reputation: 12129

First of all, try not to use eval - it is dangerous.:)

Second, try to get all the data you need into one big string. Then you can use the explode PHP function to convert the string into individual elements. And the last thing you would do is to simply iterate over the array and assign the first item as a key and the second item as an element into yet another array.

I will leave the actual implementation to you as an excercise in your PHP coding skills.:)

Upvotes: 0

Zach Spencer
Zach Spencer

Reputation: 1889

using eval is just the worst.

Here is how I would do it while keeping to your code as much as possible:

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

Upvotes: 1

Related Questions