Avatar billede Slettet bruger
14. november 2008 - 23:45 Der 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?
Avatar billede Slater Ekspert
14. november 2008 - 23:57 #1
PHP har aldrig været helt glad for [] efter parenteser. Virker det hvis du siger
$temp = end($HistoryItems);
echo $temp[0];
i stedet?
Avatar billede Slettet bruger
15. november 2008 - 00:40 #2
Se, det overvejede jeg faktisk også - jeg slog det bare hen, da jeg håbede, PHP var lidt mere solidt bygget :) Men skidt, jeg prøver i morgen.
Avatar billede micc Nybegynder
15. november 2008 - 00:58 #3
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).
Avatar billede 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.
Avatar billede 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
Avatar billede 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;
        }
    }
Avatar billede 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 ;)
Avatar billede micc Nybegynder
15. november 2008 - 12:18 #8
Der er i hvert fald et problem her:

$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 */);
Avatar billede 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.
Avatar billede Slater Ekspert
15. november 2008 - 20:56 #10
.
Avatar billede Slettet bruger
16. november 2008 - 13:38 #11
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:

99    for ($current =& Page::$CurrentPage; $current; $current =& Page::GetPage($current->Parent)
100        array_push($hierarchyItems, $current);
101    unset($current);

Parse error: syntax error, unexpected T_STRING, expecting ')' in /customers/ovrkll.com/ovrkll.com/httpd.www/development/index.php on line 100

Hvorfor får jeg denne fejl?
Avatar billede Slater Ekspert
16. november 2008 - 13:55 #12
Du mangler en ) sidst i linje 99.
Avatar billede Slettet bruger
16. november 2008 - 14:23 #13
Ja, selvfølgelig :) Mange tak!
Lige en sidste ting (forhåbentligt):

104    $hierarchyItems = array_reverse($hierarchyItems);
105    $hierarchy = "";
106    foreach ($item as &$hierarchyItems)

Warning: Invalid argument supplied for foreach() in /customers/ovrkll.com/ovrkll.com/httpd.www/development/index.php on line 106
Avatar billede Slater Ekspert
16. november 2008 - 15:32 #14
Har du ikke vendt den om? Skulle det ikke være
foreach (&$hierarchyItems as $item)
?
Avatar billede Slettet bruger
16. november 2008 - 18:12 #15
Jo. Min hjerne er vist ved at brænde sammen... Damn.
Anyway, her er nogle points. Jeg opretter lige et andet spørgsmål om et nyt problem.
Avatar billede Slettet bruger
16. november 2008 - 18:18 #16
Her:
http://www.eksperten.dk/spm/853029
Hvis I har en løsning :S
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester