2014-10-29 1 views
0

Привет и извините за мой английский.Анализ данных от mysql до json с PHP

Я хочу проанализировать данные из таблицы mysql в JSON с помощью PHP. В моей таблице есть 2 столбца: 'reg', 'base', который представляет регион и базу в этой области. Пример:

reg base 
KIE KIE1 
KIE KIE2 
KIE KIE3 
ZYT ZYT1 
ZYT ZYT2 
CHK CHK1 

и т.д.

Я пытаюсь разобрать эти значения в JSON, который выглядит как:

{"text":"Bases","leaf":false,"children":{"text":"KIE","leaf":false,"children":[{"text":"KIE1","leaf":true},{"text":"KIE2","leaf":true},{"text":"KIE3","leaf":true}]},{"text":"ZYT","leaf":false,"children":[{"text":"ZYT1","leaf":true},{"text":"ZYT2","leaf":true}]},{"text":"CHK","leaf":false,"children":[{"text":"CHK1","leaf":true}]}} 

Мой код PHP:

<?php 
      header("Content-type: application/json; charset=utf-8"); 
      $conn = mysqli_connect('localhost','test', '123','test'); 
      $bases = array('text'=>'Bases','leaf'=>false); 
      $regions = "select distinct reg from bases"; 
      $resreg = mysqli_query($conn,$regions); 
      while($reg=mysqli_fetch_assoc($resreg)){ 
       $bases['children'] = array('text'=>$reg['reg'],'leaf'=>false, 'children'=>array()); 
       $regi = $reg['reg']; 
       $query = "select base from bases where reg = '$regi' order by 1"; 
       $result = mysqli_query($conn,$query); 
       while($row = mysqli_fetch_assoc($result)){ 
        $c = array('text'=>$row['base'],'leaf'=>true); 
        $bases['children']['children'][]=$c; 
       } 
      } 
      $d = json_encode($bases); 
      echo $d; 
      mysqli_close($conn); 
?>  

Проблема я получать значения в JSON только от одного reg и дона т получить от других

Пример:

{"text":"Bases","leaf":false,"children":{"text":"KIE","leaf":false,"children":[{"text":"KIE1","leaf":true},{"text":"KIE2","leaf":true},{"text":"KIE3","leaf":true}]}  

Я не уверен, что это лучший Metod, чтобы получить то, что я хочу, но я новичок в программировании.

Может ли кто-нибудь помочь в этом или, может быть, сказать мне лучший способ сделать это? Мне нужно это для моего дерева приложений ExtJs. Спасибо.

+1

С каждой итерацией вы переписываете '$ base ['children']' '. Также вам следует рассмотреть возможность использования запроса JOIN для получения этих данных, а не для запуска множества запросов в вложенных циклах. –

+0

@MikeBrant Да, это то, что я думал. Но вы можете объяснить это больше? Может быть, пример запроса? Я действительно не понимаю, почему я должен использовать запрос с объединениями в моем случае :( – fgsfds

ответ

0

Найдено какое-то решение:

list.php

 <?php 
      header("Content-type: application/json; charset=utf-8"); 
      $conn = mysqli_connect('localhost','test', '123','test'); 
      $bases = array('text'=>'Bases','leaf'=>false,'children'=>''); 
      $regions = "select distinct reg from bases"; 
      $resreg = mysqli_query($conn,$regions); 
      while($reg=mysqli_fetch_assoc($resreg)){ 
       $bases['children'][] = array('text'=>$reg['reg'],'leaf'=>false,'children'=>''); 
      } 
      foreach($bases['children'] as $k=>$v){ 
       $query = "select base from bases where reg = '".$bases['children'][$k]['text']."'"; 
       $result = mysqli_query($conn,$query); 
       while($row=mysqli_fetch_assoc($result)){ 
        $bases['children'][$k]['children'][] = array('text'=>$row['base'],'leaf'=>true); 
       } 
      } 
      $d = json_encode($bases); 
      echo $d; 
      mysqli_close($conn); 
      ?> 

ли он похож на this

Тем не менее я считаю, что есть более простое надежное решение.

В любом случае, спасибо всем.

0
while($reg=mysqli_fetch_assoc($resreg)){ 
       $bases['children'] = array('text'=>$reg['reg'],'leaf'=>false, 'children'=>array()); 

Должен быть:

while($reg=mysqli_fetch_assoc($resreg)){ 
       $bases['children'][] = array('text'=>$reg['reg'],'leaf'=>false, 'children'=>array()); 

Потому что теперь вы добавляете array('text'=>$reg['reg'],'leaf'=>false, 'children'=>array()); индекса в $ базисов [ 'дети'] массив.

Где-то вы только что переписывали $bases['children'] каждый раз, когда цикл while работал, поэтому он будет равен только значениям последних данных, назначенных ему (последняя итерация).

Это ответ на вопрос о том, как получить $bases['children'], чтобы быть более чем одним значением, поскольку «я не знаю, является ли это лучшим методом», возьмите его для проверки кода.

+0

Его не работает.Вывод аналогичен '{" text ":" Основания "," leaf ": false," children ": {" 0 ": {" text ":" KIE "," leaf ": false," children ": []}, "дети": [{ "текст": "KIE1", "лист": истинно}, { "текст": "KIE2", "лист": истинно}, { "текст": "KIE3", "лист": истинно}, { "текст": "KIE4", "лист": истинно}, { "текст": "KIE5", "лист": истинно}, { "текст": "KIE6", "лист ": истинно}, {" текст ":" KIE7" , "лист": истинно}, { "текст": "KIE8", "лист": истинно}, { "текст": "KIE9", "лист": true}, {"text": "ZYT1", "leaf": true}, ... ' – fgsfds

+0

Я думал, что это был результат, который вы хотели? «Проблема в том, что я получаю значения в JSON только с одного рег и не получаю от других, где бы вы ни находились, у вас есть все значения сейчас, вы должны быть более четкими в отношении того, что вы хотите. – seanyt123

+0

Проблема в этом случае состоит в том, что базы не являются дочерними элементами области. т.е. я хотел дерево вот так: Основы - Регион - База. В вашем случае я получил: Базы - (Регион | База). Но вы правы - я не был ясен в этот момент. сожалею – fgsfds

Смежные вопросы