2010-02-08 85 views
0

我想在php中創建一個多維數組。這裏是我做了什麼:如何將多維轉換爲PHP中多個表的嵌套數組?

首先,我有3個表:

企業公司:

enterprise_id   name 
1      e1 
2      e2 

網站:

site_id    entreprise_id    name 
1      1      e1_site1 
2      2      e2_site1 
... 

salarie:

salarie_id   site_id     name 
1      1     e1_site1_salarie1 
2      2     e2_site1_salarie1 
... 

我有以下PHP代碼:

$query = "select * from entreprise"; 
$result = mysql_query($query); 
while($row = mysql_fetch_assoc($result)){ 

    $query2 = "select * from site where entreprise_id = $row[entreprise_id]"; 
    $result2 = mysql_query($query2); 
    $a2 = array(); 
    while($row2 = mysql_fetch_assoc($result2)){ 

     $query3 = "select * from salarie where site_id = $row2[site_id]"; 
     $result3 = mysql_query($query3); 

     while($row3 = mysql_fetch_assoc($result3)){ 
      $a3[] = array("text"=>$row3[nom]); 
     } 

     $a2[] = array("text"=>$row2[nom],'children'=>$a3); 
    } 
     $a1[] = array("text"=>$row[id]." ".$row[nom],'children'=>$a2); 
} 

但是你可以看到輸出是混合的。例如,'e1_site1_salarie1_nom'在'e1_site2'中,'e1_site1_salarie1_nom'在'e2_site2'下。真奇怪。

Array 
(
    [0] => Array 
     (
      [text] => e1 
      [children] => Array 
       (
        [0] => Array 
         (
          [text] => e1_site1 
          [children] => Array 
           (
            [0] => Array 
             (
              [text] => e1_site1_salarie1_nom 
             ) 

           ) 

         ) 

        [1] => Array 
         (
          [text] => e1_site2 
          [children] => Array 
           (
            [0] => Array 
             (
              [text] => e1_site1_salarie1_nom 
             ) 

            [1] => Array 
             (
              [text] => e1_site2_sa1 
             ) 

            [2] => Array 
             (
              [text] => e1_site2_sa2 
             ) 

           ) 

         ) 

       ) 

     ) 

    [1] => Array 
     (
      [text] => e2 
      [children] => Array 
       (
        [0] => Array 
         (
          [text] => e2_site2 
          [children] => Array 
           (
            [0] => Array 
             (
              [text] => e1_site1_salarie1_nom 
             ) 

            [1] => Array 
             (
              [text] => e1_site2_sa1 
             ) 

            [2] => Array 
             (
              [text] => e1_site2_sa2 
             ) 

            [3] => Array 
             (
              [text] => e2_site2_salarie2_nom 
             ) 

           ) 

         ) 

       ) 

     ) 

) 

我認爲這是我的PHP代碼的問題。我認爲我應該使用更多的條件判斷,例如如果其他等與下面的代碼。

 $a2[] = array("text"=>$row2[nom],'children'=>$a3); 

     $a1[] = array("text"=>$row[id]." ".$row[nom],'children'=>$a2); 

但我不知道如何改變它。

您有任何線索或建議嗎?

在此先感謝。

編輯:

繼Tatu的建議,它的工作原理。謝謝Tatu。現在我還有一個問題。我不想在數組的標題中使用[1] => Array。如何實現這一目標?

Array 
(
    [1] => Array 
     (
      [text] => e1 
      [children] => Array 
       (
        [1] => Array 
         (
          [text] => e1_site1 
          [children] => Array 
           (
            [1] => e1_site1_salarie1_nom 
           ) 

         ) 

        [3] => Array 
         (
          [text] => e1_site2 
          [children] => Array 
           (
            [3] => e1_site2_sa1 
            [4] => e1_site2_sa2 
           ) 

         ) 

       ) 

     ) 

    [2] => Array 
     (
      [text] => e2 
      [children] => Array 
       (
        [2] => Array 
         (
          [text] => e2_site2 
          [children] => Array 
           (
            [2] => e2_site2_salarie2_nom 
           ) 

         ) 

       ) 

     ) 

) 

你可以看到JSON代碼:

{"1":{"text":"e1","children":{"1":{"text":"e1_site1","children":{"1":"e1_site1_salarie1_nom"}},"3":{"text":"e1_site2","children":{"3":"e1_site2_sa1","4":"e1_site2_sa2"}}}},"2":{"text":"e2","children":{"2":{"text":"e2_site2","children":{"2":"e2_site2_salarie2_nom"}}}}} 

我想要的結果是這樣的:

{{"text":"e1","children":{{"text":"e1_site1","children":{"text":"e1_site1_salarie1_nom"}},{"text":"e1_site2","children":{"text":"e1_site2_sa1","text":"e1_site2_sa2"}}}},{"text":"e2","children":{{"text":"e2_site2","children":{"text":"e2_site2_salarie2_nom"}}}}} 

回答

1

不要做嵌套查詢,它們是完全沒有必要的,只是速度慢下來。首先獲取值,然後再合併它們。這可能工作:

$enterprise_q = mysql_query("select * from entreprise"); 
$site_q = mysql_query("select * from site"); 
$salarie_q = mysql_query("select * from salarie"); 

$result = array(); 

$enterprise = array(); 
$site = array(); 
$salarie = array(); 

# Now loop through the results 'top down', 
# starting from salaries and indexing by site_id. 
while($row = mysql_fetch_assoc($salarie_q)) { 
    # Initialize variables properly 
    if(!is_array($salarie[$row['site_id']])) { 
     $salarie[$row['site_id']] = array(); 
    } 

    $salarie[$row['site_id']][$row['salarie_id']] = $row['name']; 
} 

# Loop through sites, store sites and associated salaries by enterprise_id 
while($row = mysql_fetch_assoc($site_q)) { 
    if(!is_array($site[$row['enterprise_id']])) { 
     $site[$row['enterprise_id']] = array(); 
    } 

    $site[$row['enterprise_id']][$row['site_id']] = array(
     'name' => $row['name'], 
     'salarie' => $salarie[$row['site_id']] 
    ); 
} 

# Loop through enterprises and gather all site data 
while($row = mysql_fetch_assoc($enterprice_q)) { 
    if(!is_array($enterprise[$row['enterprise_id']])) { 
     $enterprise[$row['enterprise_id']] = array(); 
    } 

    $enterprise[$row['enterprise_id']] = array(
     'name' => $row['name'], 
     'sites' => $site[$row['enterprise_id']]; 
    ); 
} 

這不是一個最佳的方式來處理它,但它比當前更好。這應該導致這樣的陣列:

$enterprise = array(
    1 => array(
     'name' => 'e1', 
     'sites' => array(
      1 => array(
       'name' => 'e1_site1', 
       'salarie' => array(
        1 => 'e1_site1_salarie1', 
        1 => 'e1_site1_salarie2', 
        1 => 'e1_site1_salarie3' 
       ) 
      ), 
      2 => array(
       'name' => 'e1_site2', 
       'salarie' => array(
        1 => 'e1_site2_salarie1', 
        1 => 'e1_site2_salarie2' 
       ) 
      ) 
     ) 
    ), 
    2 => array(
     'name' => 'e2', 
     'sites' => array(
      1 => array(
       'name' => 'e2_site1', 
       'salarie' => array(
        1 => 'e2_site1_salarie1' 
       ) 
      ) 
     ) 
    ) 
) 

這應該是你在找什麼。我沒有測試過這個,所以不要指望它能夠第一次嘗試,但這應該至少給你一些想法。

+0

@Tatu UImanen,你是天才!有用。非常感謝。 ;) – 2010-02-08 11:24:11

0
I would roll the entire database interaction into one query and then just use that to populate the array as you require it. That would be .. 

    $query = 'SELECT e.enterprise_id,'. 
        'e.name as enterprise,'. 
        's.site_id,'. 
        's.name as site,'. 
        'sa.salarie_id,'. 
        'sa.name as salarie '. 
      'FROM enterprise e,'. 
        'site s,'. 
        'salarie sa ' 
      'WHERE e.enterprise.id=s.enterprise.id'. 
      'AND sa.site_id=s.site_id'; 
    $result = 
mysql_query($query); while($row = 
mysql_fetch_assoc($result)){ 
$resultArray[$row['enterprise'][$row['site']][$row['salarie_id']] 
    = $row['salarie']; 

該解決方案,當然,要求兩個企業和站點名稱也是唯一的 - 否則,您將不得不使用ID作爲索引,並且只能稍後映射到名稱。

+0

您的答案中的問題是,這隻會保存數組中的salarie的值,而OP會要求一個解決方案來存儲所有中間值。 – 2010-02-08 10:57:41