2015-11-04 144 views
0

我試圖構建多維獲取json,但它變得複雜一點。當然有更簡單的方法來做到這一點。這是我的代碼。多維數組php

$rows = array(); 
$idx = 0; 
$sql = "SELECT products, GROUP_CONCAT(title,',' ,price SEPARATOR ', ') prods FROM mylist GROUP BY products";  
$query = mysqli_query($con, $sql); 
while($row = mysqli_fetch_assoc($query)){ 
    $rows[$idx]['products'] = $row['products']; 
    $title = explode(',',$row['prods']); 
    $rows[$idx]['prods'] = $title; 
    $idx++; 
}; 
echo '<pre>' . var_export($rows, true) . '</pre>'; 
echo json_encode($rows); 

它給我這個結果

array (
    0 => 
    array (
    'prods' => 
    array (
     0 => 'title 4', 
     1 => '4', 
     2 => ' title 1', 
     3 => '1', 
    ), 
), 
    1 => 
    array (
    'prods' => 
    array (
     0 => 'title 2', 
     1 => '21', 
    ), 
), 
    2 => 
    array (
    'prods' => 
    array (
     0 => 'title 3', 
     1 => '3', 
    ), 
), 
) 
[{"prods":["title 4","4"," title 1","1"]},{"prods":["title 2","21"]},{"prods":["title 3","3"]}] 

但我想這樣

array (
    0 => 
    array (
    'prods' => 
    array (
     array(title => 'title 4', price => '4'), 
     array(title => ' title 1', price => '1'), 
    ), 
), 
    1 => 
    array (
    'prods' => 
    array (
     array(title => 'title 2', price => '21'), 
    ), 
), 
    2 => 
    array (
    'prods' => 
    array (
     array(title => 'title 3', price => '3'), 
    ), 
), 
) 



    [ 
    { 
     "prods": [ 
      { 
       "title": "title 4", 
       "price": "4" 
      }, 
      { 
       "title": "title1", 
       "price": "1" 
      } 
     ] 
    }, 
    { 
     "prods": [ 
      { 
       "title": "title2", 
       "price": "21" 
      } 
     ] 
    }, 
    { 
     "prods": [ 
      { 
       "title": "title3", 
       "price": "3" 
      } 
     ] 
    } 
] 

所以,不知道如何分解的數據混合在陣列來獲得編碼的右JSON。

+1

該代碼不會產生該輸出。 – AbraCadaver

+0

你放棄了還是什麼? – AbraCadaver

+0

仍然在努力... – alflashy

回答

1

你可以對$ title數組做一個foreach,如果鍵是偶數,那麼用所需的鍵構建輸出數組。在下面我編輯替代你的數據庫查詢的JSON,以便完整的示例可以包含在沒有SQL查詢。

$rows = array(); 
$idx = 0; 
$data = json_decode('[{"products":"the product", "prods":"title 4,4,title 1,1"},{"products":"the product", "prods":"title 2,21"},{"products":"the product", "prods":"title 3,3"}]', true); 
foreach ($data as $row) 
{ 
    $rows[$idx]['products'] = $row['products']; 
    $title = explode(',',$row['prods']); 
    foreach ($title as $k => $v) { 
    // check if even 
    if ($k % 2 == 0) $rows[$idx]['prods'][] = array('title' => $v, 'price' => $title[$k+1]); 
    } 
    $idx++; 
}; 
echo '<pre>' . var_export($rows, true) . '</pre>'; 
echo json_encode($rows); 

會輸出如下

array (
    0 => 
    array (
    'products' => 'the product', 
    'prods' => 
    array (
     0 => array ('title' => 'title 4','price' => '4'), 
     1 => array ('title' => 'title 1','price' => '1'), 
    ), 
), 
    1 => 
    array (
    'products' => 'the product', 
    'prods' => 
    array (
     0 => array ('title' => 'title 2','price' => '21'), 
    ), 
), 
    2 => 
    array (
    'products' => 'the product', 
    'prods' => 
    array (
     0 => array ('title' => 'title 3','price' => '3'), 
    ), 
), 
) 
+0

謝謝特里斯坦,但產品可能有更多的兩個產品,所以想知道如果我必須循環內循環。就像我已經有產品循環,所以現在我有產品循環內的循環標題和價格 – alflashy

+0

看起來不錯Tristan,我得到了類似的解決方案,但有點不同,我發佈爲答案2下面。你能告訴我哪個更好嗎?謝謝 – alflashy

1

基於特里斯坦早先提出的建議,我可以用下面的代碼,以獲得期望的結果,不知道這是最好的方式。

$rows = array(); 
$idx = 0; 
$sql = "SELECT products, GROUP_CONCAT(title,',',price SEPARATOR ';') prods FROM mylist GROUP BY products";  
$query = mysqli_query($con, $sql); 

while($row = mysqli_fetch_assoc($query)){ 
    $prods = explode(';',$row['prods']); 
    foreach ($prods as $key => $value) { 
     $expValue = explode(',',$value); 
     $rows[$idx]['prods'][] = array('title' => $expValue[0], 'price' => $expValue[1]); 
    }; 
    $idx++; 
}; 
echo '<pre>' . var_export($rows, true) . '</pre>'; 

echo json_encode($rows); 
+0

看起來不錯@alflashy,並且可能通過更改sql查詢更易讀。 – Tristan

+0

感謝您的幫助@Tristan – alflashy