如何在PHP中从多个表将多维数组转换为嵌套数组?
我想用php制作一个多维数组。以下是我所做的: 首先,我有3张表: 企业:如何在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
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要求提供一个还将存储所有中间值的解决方案。