Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Sisäkkäiset foreach-silmukat

jmaki [08.06.2012 17:39:53]

#

Hei,

haen listaa tiedostonimistä/kansionimistä tietokannasta, siten että ensin luetaan ylimmän tason Kansio, sen jälkeen kansion alakansiot ja tiedostot, ala-alakansiot ja tiedostot jne.. Koodiesimerkki alla, jossa haetaan tiedot viideltä tasolta.
Alla oleva koodi toimii haluamallani tavalla, mutta haluaisin mahdollisuuden määrittää "foreach-silmukoiden" määrän, kun tiedossa on tasojen määrä.

Eli, jos tasojen määrä on määritetty kymmeneksi, tulisi foreach 10 kertaa sisäkkäin.

Olen yrittänyt for/while silmukoiden avulla, mutta en saa tuota silmukoiden sisäkkäisyyttä aivoillani toimimaan.

Olisin kiitollinen, jos joku osaa ohjata oikeaan suuntaan.

$this->Lib->DBHandler->sqlQuery('SELECT * FROM t_dir_'.$idNum.' WHERE DI_ID = 1');
				$arrFiles = $this->Lib->DBHandler->result;
				$list = array();
				foreach($arrFiles as $fileName){
						$this->Lib->DBHandler->sqlQuery('SELECT * FROM t_dir_'.$idNum.' WHERE DI_parent_id = '.$fileName['DI_ID'].' ORDER BY DI_name ASC');
						$arrFiles = $this->Lib->DBHandler->result;
						if(!empty($arrFiles)){
						foreach($arrFiles as $fileName){
							$list[] = $fileName['DI_name'];
							$this->Lib->DBHandler->sqlQuery('SELECT * FROM t_dir_'.$idNum.' WHERE DI_parent_id = '.$fileName['DI_ID'].' ORDER BY DI_name ASC');
							$arrFiles = $this->Lib->DBHandler->result;
							if(!empty($arrFiles)){
							foreach($arrFiles as $fileName){
								$list[] = $fileName['DI_name'];
								$this->Lib->DBHandler->sqlQuery('SELECT * FROM t_dir_'.$idNum.' WHERE DI_parent_id = '.$fileName['DI_ID'].' ORDER BY DI_name ASC');
								$arrFiles = $this->Lib->DBHandler->result;
								if(!empty($arrFiles)){
								foreach($arrFiles as $fileName){
									$list[] = $fileName['DI_name'];
									$this->Lib->DBHandler->sqlQuery('SELECT * FROM t_dir_'.$idNum.' WHERE DI_parent_id = '.$fileName['DI_ID'].' ORDER BY DI_name ASC');
									$arrFiles = $this->Lib->DBHandler->result;
									if(!empty($arrFiles)){
									foreach($arrFiles as $fileName){
										$list[] = $fileName['DI_name'];
									}
									}
								}
								}
							}
							}
						}
						}
				}

Metabolix [08.06.2012 17:56:17]

#

Oletko kuullut funktioista ja rekursiosta?

Tauluja ei pitäisi koskaan luoda dynaamisesti, eli luultavasti kantarakenteessasi olisi parantamisen varaa.

Jos riittää, että saadaan sisimmän tason tiedot, ongelman voi ratkaista helposti myös näin:

function kysely($id, $tasoja, $taulu) {
	$sql = "SELECT t{$tasoja}.DI_name FROM {$taulu} AS t{$tasoja}\n";
	for ($i = $tasoja; $i > 0; --$i) {
		$j = $i - 1;
		$sql .= "JOIN {$taulu} AS t{$j} ON t{$i}.DI_parent_id = t{$j}.DI_ID\n";
	}
	$sql .= "WHERE t{$i}.DI_ID = {$id}\n";
	return $sql;
}
echo kysely(1, 3, "taulu");
SELECT t3.DI_name FROM taulu AS t3
JOIN taulu AS t2 ON t3.DI_parent_id = t2.DI_ID
JOIN taulu AS t1 ON t2.DI_parent_id = t1.DI_ID
JOIN taulu AS t0 ON t1.DI_parent_id = t0.DI_ID
WHERE t0.DI_ID = 1

Toki kyselyyn voi lisätä ylempien tasojen tietojen palautuksen, jolloin ylemmät tiedot tulevat joka riville uudestaan.

function kysely($id, $tasoja, $taulu) {
	$kentat = array();
	for ($i = 0; $i <= $tasoja; ++$i) {
		$kentat[] = "t{$i}.DI_name AS name_{$i}";
	}
	$kentat = implode(",\n", $kentat);

	$taulut = array("FROM {$taulu} AS t{$tasoja}");
	for ($i = $tasoja; $i > 0; --$i) {
		$j = $i - 1;
		$taulut[] = "RIGHT JOIN {$taulu} AS t{$j} ON t{$i}.DI_parent_id = t{$j}.DI_ID";
	}
	$taulut = implode("\n", $taulut);
	return "SELECT\n{$kentat}\n{$taulut}\nWHERE t{$i}.DI_ID = {$id}\n";
}
echo kysely(1, 3, "taulu");
SELECT
t0.DI_name AS name_0,
t1.DI_name AS name_1,
t2.DI_name AS name_2,
t3.DI_name AS name_3
FROM taulu AS t3
RIGHT JOIN taulu AS t2 ON t3.DI_parent_id = t2.DI_ID
RIGHT JOIN taulu AS t1 ON t2.DI_parent_id = t1.DI_ID
RIGHT JOIN taulu AS t0 ON t1.DI_parent_id = t0.DI_ID
WHERE t0.DI_ID = 1

The Alchemist [08.06.2012 18:54:33]

#

Kaikki tiedostot ja hakemistot yhteen tauluun, ei mitään turhia ja epävakaita purkkaviritelmiä. Sitten voit hakea tavaran yhdellä kyselyllä ja järjestellä sen puuksi PHP:n päässä.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta