2012-09-14 102 views
0

我有一个PHPMySQL在我的脚本如下所示while循环获取。我得到的结果是类似下面(JSON):PHP while循环错误

[ 
    { 
     "productname":"Veg.Pizaa", 
     "price":"350", 
     "discount":"", 
     "discountprice":"350", 
     "imageURL":"http:\/\/farm8.staticflickr.com\/7154\/6694188161_9ee692d854_s.jpg", 
     "category":"Pizaa", 
     "configurablepone":[{"catname":"Extra","Pro0":"Extra 25g Cheese","Pro1":"Extra 75g Cheese"},"catname":"Nuts","Pro0":"Almonds","Pro1":"Peanuts","Pro2":"Pistachios"}], 
     "configurable":"yes" 
    }, 
    { 
     "productname":"Core i7 Pc", 
     "price":"48000", 
     "discount":"2", 
     "discountprice":"47040", 
     "imageURL":"http:\/\/www.4to40.com\/images\/science\/Basic_Computer_Parts\/Computer.jpg", 
     "category":"Pc", 
     "configurablepone":[{"catname":"Extra","Pro0":"Extra 25g Cheese","Pro1":"Extra 75g Cheese"},{"catname":"Nuts","Pro0":"Almonds","Pro1":"Peanuts","Pro2":"Pistachios"},{"catname":"Harddisk","Pro0":"Segate 500Gb","Pro1":"Samsung 250Gb"},{"catname":"Ram","Pro0":"8Gb Ram","Pro1":"4Gb Ram","Pro2":"2Gb Ram"}], 
     "configurable":"yes" 
    } 
] 

但我需要的结果是象下面这样:

[ 
    { 
     "productname":"Veg.Pizaa", 
     "price":"350", 
     "discount":"", 
     "discountprice":"350", 
     "imageURL":"http:\/\/farm8.staticflickr.com\/7154\/6694188161_9ee692d854_s.jpg", 
     "category":"Pizaa", 
     "configurablepone":[{"catname":"Extra","Pro0":"Extra 25g Cheese","Pro1":"Extra 75g Cheese"},"catname":"Nuts","Pro0":"Almonds","Pro1":"Peanuts","Pro2":"Pistachios"}], 
     "configurable":"yes" 
    }, 
    { 
     "productname":"Core i7 Pc", 
     "price":"48000", 
     "discount":"2", 
     "discountprice":"47040", 
     "imageURL":"http:\/\/www.4to40.com\/images\/science\/Basic_Computer_Parts\/Computer.jpg", 
     "category":"Pc", 
     "configurablepone":[{"catname":"Harddisk","Pro0":"Segate 500Gb","Pro1":"Samsung 250Gb"},{"catname":"Ram","Pro0":"8Gb Ram","Pro1":"4Gb Ram","Pro2":"2Gb Ram"}], 
     "configurable":"yes" 
    } 
] 

正如你可以看到configurablepone得到重复JSON为每个循环,使我得到在第二个产品也是第一个产品的价值,但我需要单独象下面这样:

第一制品像下面

"configurablepone":[{"catname":"Extra","Pro0":"Extra 25g Cheese","Pro1":"Extra 75g Cheese"},{"catname":"Nuts","Pro0":"Almonds","Pro1":"Peanuts","Pro2":"Pistachios"}] 

其次产品像下面

"configurablepone":[{"catname":"Harddisk","Pro0":"Segate 500Gb","Pro1":"Samsung 250Gb"},{"catname":"Ram","Pro0":"8Gb Ram","Pro1":"4Gb Ram","Pro2":"2Gb Ram"}] 

我试图改变的循环,但我还没有找到任何解决方案。请帮我解决这个问题。

+1

的foreach($ childarr为$ childarr):< - 这样不是会使问题?他们似乎和我有同样的名字。 – Shadow

+0

@shadow我已经尝试更改每个名称,但它导致相同的问题 –

+2

欢迎来到堆栈溢出!请不要使用'mysql_ *'函数来编写新的代码。他们不再维护,社区已经开始[弃用程序](http://goo.gl/KJveJ)。请参阅* [红盒子](http://goo.gl/GPmFd)*?相反,您应该了解[准备好的语句](http://goo.gl/vn8zQ)并使用[PDO](http://php.net/pdo)或[MySQLi](http://php.net/ mysqli的)。如果你不能决定哪些,[这篇文章](http://goo.gl/3gqF9)会帮助你。如果你选择PDO,[这里是很好的教程](http://goo.gl/vFWnC)。 –

回答

0

只需使用unset($subpro1);array_push($totArr, $prodObj2);。 下面是一个例子来源 试试这个这可能工作

$result2211 = mysql_query("select * from products where is_config = 'yes' "); 
while($row2211 = mysql_fetch_assoc($result2211)) 
{ 
    $sn = $row2211['sn']; 
    $allparrentselectq = mysql_query("SELECT * FROM parrentpro where parrentsn = $sn"); 
    while($allparrentselect = mysql_fetch_assoc($allparrentselectq)) 
    { 
     $childarr = unserialize($allparrentselect['childsn']); 
     $subpro = '{"catname":"'.$allparrentselect['childname'].'",'; 
     $i = 0; 
     foreach($childarr as $childarr): 
      $subpro .= '"Pro'.$i++.'":"'.$childarr.'",'; 
     endforeach; 
     $subpro1[] = substr($subpro, 0, -1)."}"; 
     $subproa = "[".implode(",",$subpro1)."]"; 
    } 
    $prodObj2 = new ProductDetails(); 
    $prodObj2->productname = $row2211['productname']; 
    $prodObj2->price = $row2211['productprice']; 
    $prodObj2->discount = $row2211['discount']; 
    $prodObj2->discountprice = $row2211['discountprice']; 
    $prodObj2->imageURL = $row2211['productimageurl']; 
    $prodObj2->category = $row2211['productcat']; 
    $prodObj2->configurablepone = $subproa; 
    $prodObj2->configurable = 'yes'; 
    array_push($totArr, $prodObj2); 
    unset($subpro1); 
} 
-1
while($allparrentselect = mysql_fetch_assoc($allparrentselectq)) 
{ 
    $childarr = unserialize($allparrentselect['childsn']); 
    $subpro = '{"catname":"'.$allparrentselect['childname'].'",'; 
    $i = 0; 
    foreach($childarr as $childarr): 
     $subpro .= '"Pro'.$i++.'":"'.$childarr.'",'; 
    endforeach; 
    $subpro1[] = substr($subpro, 0, -1)."}"; 
    $subproa = "[".implode(",",$subpro1)."]"; 
    $subpro1 = array(); 
} 

尝试这种在第二while循环

+0

不能同样的问题 –

2

我认为,在线路$subpro1[] = substr($subpro, 0, -1)."}";您的问题。

因此,该行的第一个呼叫将“Veg.Pizaa”的数据保存到$subpro1[0]。 该行的第二个调用将数据从“Core i7 Pc”保存到$subpro1[1]

然后,行$subproa = "[".implode(",",$subpro1)."]";合并所有数组元素。

+0

你能解释一下吗?更多Sir –

+1

'$ subpro'是当前项目的子产品列表。在'while'循环中,我们得到比萨的子过程,并将它保存在数组'$ subpro1'的第一个元素中($ subpro1 [0]包含值:''Pro0“:”额外25g奶酪“,”Pro1“:”Extra 75g Cheese然后我们得到处理器的副产品,并将它保存在数组'subpro1'的第二个元素中($ subpro1 [1]包含'“Pro0”:“Segate 500Gb”,“Pro1”:“Samsung 250Gb”'。函数'implode'将两个元素都合并到第二个产品的一个字符串中。因此,在使用新数据填充之前,数组'$ subpro1'必须为空。通过'$ subpro1 = array()'或'unset($ subpro1)'。 – doktorgradus

+0

如何可以在动物中可以向我展示一个例子先生 –