Oprettet fre. d. 14. november 2008 kl. 23:45:53

hf2ke
hf2ke (5.637 point. Point ude: 0)

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?

Skrevet fre. d. 14. november 2008 kl. 23:57:08| #1

viperine
viperine (35.213 point)
www.amunium.dk
PHP har aldrig været helt glad for [] efter parenteser. Virker det hvis du siger
$temp = end($HistoryItems);
echo $temp[0];
i stedet?

Skrevet lør. d. 15. november 2008 kl. 00:40:08| #2

hf2ke
hf2ke (5.637 point)
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.

Skrevet lør. d. 15. november 2008 kl. 00:58:18| #3

micc
micc (7.860 point)
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).

Skrevet lør. d. 15. november 2008 kl. 01:24:25| #4

hf2ke
hf2ke (5.637 point)
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.

Skrevet lør. d. 15. november 2008 kl. 01:26:43| #5

hf2ke
hf2ke (5.637 point)
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

Skrevet lør. d. 15. november 2008 kl. 11:22:04| #6

hf2ke
hf2ke (5.637 point)
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;
        }
    }

Skrevet lør. d. 15. november 2008 kl. 11:24:34| #7

hf2ke
hf2ke (5.637 point)
Faktisk brokker PHP sig allerede ved $Temporary = array_reverse($HistoryItems);... Men det kunne man jo have sagt sig selv ;)

Skrevet lør. d. 15. november 2008 kl. 12:18:27| #8

micc
micc (7.860 point)
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 */);

Skrevet lør. d. 15. november 2008 kl. 13:58:14| #9

hf2ke
hf2ke (5.637 point)
Hov! Jeg troede, array_push returnerede det samlede array og ikke i sig selv modificerede basen... Meh. Jeg retter lige igennem.

Skrevet lør. d. 15. november 2008 kl. 20:56:36| #10


Skrevet søn. d. 16. november 2008 kl. 13:38:00| #11

hf2ke
hf2ke (5.637 point)
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?

Skrevet søn. d. 16. november 2008 kl. 13:55:58| #12

viperine
viperine (35.213 point)
www.amunium.dk
Du mangler en ) sidst i linje 99.

Skrevet søn. d. 16. november 2008 kl. 14:23:43| #13

hf2ke
hf2ke (5.637 point)
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

Skrevet søn. d. 16. november 2008 kl. 15:32:37| #14

viperine
viperine (35.213 point)
www.amunium.dk
Har du ikke vendt den om? Skulle det ikke være
foreach (&$hierarchyItems as $item)
?

Skrevet søn. d. 16. november 2008 kl. 18:12:02| #15

hf2ke
hf2ke (5.637 point)
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.

Skrevet søn. d. 16. november 2008 kl. 18:18:38| #16


Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   

   

Seneste spørgsmål

Brugerliste med link til profil

Oprettet den 26. maj 2012 kl. 14.29
sayn giver 30 point for svar | Giv et svar »

php curl driller

Oprettet den 26. maj 2012 kl. 08.31
PHPnQrd giver 200 point for svar | Giv et svar »

Array i array

Oprettet den 25. maj 2012 kl. 08.32
sebster giver 60 point for svar | Giv et svar »



   




Tips & Tricks fra PC World

Teaser billede

Læserne: Her er vores værste it-indkøb

Det er ikke al it-udstyr, som er det rene guld. Her er nogle af læsernes skrækhistorier.


Anmeldelser fra PC World

Teaser billede

Test: Mobil med Ferrari-design - og en Trabant-motor

Motorola har begået endnu en smartphone med lækkert design og potentiale til at være blandt de bedste. Men den når ikke i mål. Se her hvorfor.


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Sådan siger du farvel til Facebook

Læs her, hvordan du dropper Facebook og i stedet anvender nogle brugervenlige alternativer, så du stadig kan være social på nettet.


Nyheder fra Computerworld

Teaser billede

Galleri: De fedeste håndholdte gennem 40 år

Her har du de mest banebrydende håndholdte computere gennem alle tider.


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger