简体   繁体   中英

How to create multidimensional PHP array from this string?

I have a string I would like to separate and make a multidimensional array out of. The string looks like this:

$string = "item-size:large,color:blue,material:cotton,item-size:medium,color:red,material:silk,";

Unfortunately, I have no control over how the string is put together, which is why I'm trying to make this array.

My goal is to make an array like this:

$item[1]['color'] // = blue
$item[2]['material'] // = silk

So, here's what I've done:

$item = array();

$i=0; // I know this is messy
$eachitem = explode("item-",$string);
array_shift($eachitem); // get rid of the first empty item  

foreach ($eachitem as $values) {

    $i++; // Again, very messy
    $eachvalue = explode(",",$values);
    array_pop($eachvalue); // get rid of the last comma before each new item

    foreach ($eachvalue as $key => $value) {

        $item[$i][$key] = $value;

    }

}

I'm obviously lost with this... any suggestions?

You're close, this is how I would do it:

$string = "item-size:large,color:blue,material:cotton,item-size:medium,color:red,material:silk,";
$substr = explode("item-", $string);
$items = array();
foreach ($substr as $string) {
    $subitems = array();
    $pairs = explode(",", $string);
    foreach ($pairs as $pair) {
        list($key, $value) = explode(":", $pair, 2);
        $subitems[$key] = $value;
    }
    $items[] = $subitems;
}
var_dump($items);

Using list here is great :) Do note that you would need the extra count limiter in explode else you might lose data if there are more : .

$array = array();
$string = explode(',', $string);
foreach($string as $part):
   $part = trim($part);
   if(strlen($part) < 3) continue;
   $part = explode(':', $part);
   $array[$part[0]] = $part[1];
endforeach;

You're mostly there. Just replace your inner foreach with

foreach ($eachvalue as $value) {
    $properties = explode(':', $value);
    $item[$i][$properties[0]] = $properties[1];

}
$string = "item-size:large,color:blue,material:cotton,item-size:medium,color:red,material:silk,";
$num_attr = 3;

$item = array();
$i=$x=0;
foreach(explode(',', trim($string,',')) as $attr)
{
    list($key, $value) = explode(':', $attr);
    $item[$x+=($i%$num_attr==0?1:0)][$key] = $value;
    $i++;
}

Set the $num_attr to the number of item attributes in the string (this will allow adjustments in the future if they grow/shrink). The trim inside the foreach is removing ay "empty" data like the last comma (it will also remove a empty first comma if one ever shows up). The crazy looking $item[$x+=($i%$num_attr==0?1:0)] is taking the modulus of the counter / number of attributes which when it is 0 that means we are on a new product line so we add 1 to x which populates the item number index, if the modulus returns a number then we know we are on the same product so we add 0 which doesn't change the items index so that attribute is added on to the same item.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM