2012-05-10 107 views
1

我有一个字符串,我想单独制作一个多维数组。该字符串看起来是这样的:如何从这个字符串创建多维PHP数组?

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

不幸的是,我有过的字符串是如何放在一起,这就是为什么我试图让这个数组没有控制权。

我的目标是做一个这样的数组:

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

所以,这里是我做了什么:

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

    } 

} 

我显然与此...任何建议失去了什么?

+0

这是否总是字符串的格式?哪些部分可能会发生变化? –

回答

0

你大部分都在那里。只是

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

} 
0

你靠近,这是我会怎么做:

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

使用list这里是伟大的:)别注意,你需要在explode额外的计数限否则你可能会失去,如果有数据更多:

0
$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; 
0
$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++; 
} 

设置$ num_attr项的数量字符串中的属性替换你的内心foreach(这将允许在未来的调整,如果他们放大/缩小)。 foreach内部的修剪会删除像最后一个逗号这样的“空”数据(如果有人出现,它也会删除空的第一个逗号)。看起来很疯狂的$ item [$ x + =($ i%$ num_attr == 0?1:0)]取的是计数器的模数/属性的数量,当它为0时意味着我们在新的产品线上我们将1添加到填充项目号索引的x,如果模数返回一个数字,那么我们知道我们在同一个产品上,所以我们添加0,这不会改变项目索引,因此该属性会添加到同一个项目中。