Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP中从多个表将多维数组转换为嵌套数组?_Php_Arrays - Fatal编程技术网

如何在PHP中从多个表将多维数组转换为嵌套数组?

如何在PHP中从多个表将多维数组转换为嵌套数组?,php,arrays,Php,Arrays,我想用php制作一个多维数组。以下是我所做的: 首先,我有3张表: 企业: enterprise_id name 1 e1 2 e2 地点: 薪金: salarie_id site_id name 1 1 e1_site1_salarie1 2

我想用php制作一个多维数组。以下是我所做的:

首先,我有3张表:

企业:

enterprise_id         name
1                      e1
2                      e2
地点:

薪金:

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_站点1_salarie1_nom”位于“e1_站点2”中,“e1_站点1_salarie1_nom”位于“e2_站点2”下。真奇怪

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代码的问题。我认为我应该在下面的代码中使用更多的条件判断,比如if-else等

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

        $a1[] = array("text"=>$row[id]." ".$row[nom],'children'=>$a2);
但我不知道如何改变它

你有什么线索或建议吗

提前谢谢

编辑:

按照塔图的建议,它是有效的。谢谢塔图。现在我还有一个问题。我不希望数组的头中有
[1]=>数组。如何做到这一点

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"}}}}} 
$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'
                )
            )
        )
    )
)

当然,该解决方案要求企业名称和站点名称都是唯一的——否则,您将不得不使用ID作为索引,以后只映射到名称

不要执行嵌套查询,它们完全没有必要,只会减慢速度。首先获取值,然后将其合并。这可能会奏效:

$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']];
    );
}
这不是一个处理它的最佳方法,但它比您当前的方法要好。这将产生如下数组:

{{"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"}}}}} 
$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'
                )
            )
        )
    )
)

这应该是你要找的。我还没有对此进行测试,所以不要期望它在第一次尝试时起作用,但这至少会给您一些想法。

您的答案中的问题是,这只会在数组中保存薪水的值,而OP要求提供一个还将存储所有中间值的解决方案。