2010-02-08 84 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