2012-05-10 10 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

あなたはほとんどそこにいます。ただ、(彼らは/縮小を育てる場合、これは将来的に調整ができるようになります)項目の番号への$ num_attrは、文字列に属性を設定

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

} 
0

あなたが近くにいる、これは私はそれを行うだろうかです:ここlistを使用して

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

は素晴らしい:)は、あなたがそこにいる場合は、データを失うかもしれない他のexplodeに余分なカウント制限を必要とすることに注意してくださいですmore :です。

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

であなたの内foreachを交換してください。 foreach内のトリムは最後のカンマのような "空の"データを削除しています(空の場合は空の最初のコンマも削除されます)。クレイジーな$ item [$ x + =($ i%$ num_attr == 0?1:0)]は、カウンタの係数/属性の数を取っています。モジュラスが数値を返す場合は、アイテム番号インデックスに値を設定するxに1を追加し、同じ商品に属していることを認識して、アイテムインデックスを変更しない0を追加して、同じアイテムに属性を追加します。