14. november 2008 - 23:45Der er
14 kommentarer og 2 løsninger
Problem med array i array
Hej eksperter,
Jeg har et problem med et array i et andet array. Her er den problematiske del af koden:
$HistoryItems = array(); for ($currentPage = array($Page_Properties[0]); $currentPage[0] != ""; $currentPage = Database::GetRow($Table_Pages, "parent, title", "WHERE location='".$currentPage[0]."'")) // Database::GetRow er en forudprogrammeret MySQL-funktion baseret på mysql_fetch_row og returnerer derfor et array af udhentede værdier array_push($HistoryItems, $currentPage); if (end($HistoryItems)[0] != Settings::$Index && $Page_Location != Settings::$Index) // Settings::$Index er en streng array_push($HistoryItems, Settings::$Index);
PHP melder fejl ved end($HistoryItems)[0], fordi den tilsyneladende ikke har forstået, at sidste element i $HistoryItems er endnu et array - og at det derfor er muligt at hente index 0. Fjerner jeg [0] således: end($HistoryItems) ... er der ingen problemer - bortset fra, at end($HistoryItems) er et array og ikke den strengværdi, jeg skal bruge! Hvordan løser jeg problemet og får adgang til min streng?
Jeg kan bekræfte viperine's observation - jeg har testet både i php4 og php5 og med alle tænkelige kombinationer af (), {} og [] paranteser, men jeg kan ikke få den til at acceptere [] efter andet end en $variabel ligesom fx javascript kan. Løsningen med $temp er også den bedste jeg har hørt om til dato (men jeg vil meget gerne overraskes).
Synes godt om
Slettet bruger
15. november 2008 - 01:24#4
Utroligt! På den ene side er det skidt, at PHP-fortolkeren er så ringe gennemført... På den anden side er det rimelig dejligt, at ikke er min fejl ;) For en gangs skyld kan jeg tillade mig at sige, at det hele er PHP's skyld! Tak for jeres kommentarer - smid vensligst et svar hver.
Synes godt om
Slettet bruger
15. november 2008 - 01:26#5
Og jeg vil forresten stadig gerne have en, om ikke andet, kort-efter-post-rettefunktion på Eksperten... Ellers går det helt galt, når man bliver så træt, som jeg er nu :P
Synes godt om
Slettet bruger
15. november 2008 - 11:22#6
Hm. Jeg har haft diverse problemer med arrays i arrays og løst dem ved at erstatte hele lortet med et enkelt array bestående af instanser af klassen Page. Dog har jeg stadig et problem:
$HistoryItems = array(); for ($currentPage = $Page_Properties[0]; $currentPage != ""; $temporary = Database::GetRow($Table_Pages, "parent, title", "WHERE location='".$currentPage."'"), $HistoryItems = array_push($HistoryItems, new Page($currentPage, $temporary[0], $temporary[1]))) $currentPage = $temporary[0]; if (end($HistoryItems).L != Settings::$Index && $Page_Location != Settings::$Index) $HistoryItems = array_push($HistoryItems, new Page(Settings::$Index, "", Database::GetCell($Table_Pages, "title", "WHERE location='".Settings::$Index."'", 0) or die(mysql_error()))); $History = ""; $Temporary = array_reverse($HistoryItems); foreach ($Temporary as $historyItem)
PHP insisterer på, at $Temporary ikke er et array. Hvorfor? Hvis det har noget interesse, er Page-klassen opbygget som følger:
class Page { public $L; public $P; public $T; function __construct($location, $parent = "", $title = "") { $this->L = $location; $this->P = $parent; $this->T = $title; } }
Synes godt om
Slettet bruger
15. november 2008 - 11:24#7
Faktisk brokker PHP sig allerede ved $Temporary = array_reverse($HistoryItems);... Men det kunne man jo have sagt sig selv ;)
$HistoryItems = array_push($HistoryItems, new Page(/* en masse kode */));
array_push() returnerer nemlig antal af elementer i array'et, så faktisk overskriver du indholdet af $HistoryItems med et tal. Problemet kan undgås ved bare at bruge:
array_push($HistoryItems, new Page(/* en masse kode */));
eller bare:
$HistoryItems[] = new Page(/* en masse kode */);
Synes godt om
Slettet bruger
15. november 2008 - 13:58#9
Hov! Jeg troede, array_push returnerede det samlede array og ikke i sig selv modificerede basen... Meh. Jeg retter lige igennem.
Igen besluttede Eksperten sig for at slette min post! Hvornår bliver den fejl rettet?! Anyway. Her er min tidligere besked:
Christ! Nu har jeg omskrevet hele koden med henblik på optimering og større anvendelse af OOP. Det gør det hele mere overskueligt - det er bare et problem:
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.