PHP birkaç tablo bir iç içe geçmiş bir dizi çok boyutlu dönüştürmek nasıl?

2 Cevap php

Ben php çok boyutlu bir dizi yapmak istiyorum. İşte ben yaptım budur:

Öncelikle, ben 3 tablolar var:

Entreprise:

enterprise_id         name
1                      e1
2                      e2

site:

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
...

Ben şu PHP kodu:

$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);
}

Ama çıkışına karışık olduğunu görebilirsiniz. Örneğin, 'e1_site1_salarie1_nom' e1_site2 'olduğunu,' e1_site1_salarie1_nom 'e2_site2' altında. Bu garip.

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
                                        )

                                )

                        )

                )

        )

)

Ben benim php kod sorunu olduğunu düşünüyorum. Ben şu kodla vb else if gibi daha koşullu yargı kullanmak gerektiğini düşünüyorum.

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

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

Ama bunu değiştirmek için nasıl bilmiyorum.

Eğer herhangi bir ipucu ya da öneriniz var mı?

Şimdiden teşekkürler.

Edit:

Tatunun öneriyi takiben, çalışır. Teşekkürler Tatu. Şimdi ben bir soru daha var. Ben dizilerin başlığında [1] => Array istemiyorum. Bunu başarmak için?

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
                                )

                        )

                )

        )

)

Sen json kodunu görebilirsiniz:

{"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"}}}}} 

Ben sonuç bu gibi olmak istiyorum:

{{"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"}}}}} 

2 Cevap

Iç içe geçmiş sorguları yapmayın, onlar aşağı tamamen gereksiz ve sadece yavaş şeyler vardır. İlk değerleri alın ve daha sonra bunları birleştirmek. Bu işe yarayabilir:

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

Bu işlemek için optimal bir yol değildir, ancak sizin akımından daha iyidir. Bu, böyle bir dizi bir şey neden:

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

Aradığınız ne olmalıdır, hangi. Ben bu yüzden ilk denemede çalışmak beklemeyin test değil, ama bu en azından bazı fikirler verecektir.

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'];

Aksi takdirde, endeks olarak kimlikleri kullanmak gerekir ve sadece daha sonra adlarına haritası - Bu çözüm, tabii ki, kurumsal ve site adı hem de benzersiz olmasını gerektirir.