webForumDet fria alternativet

Arrayproblem

9 svar · 637 visningar · startad av überfuzz

überfuzzMedlem sedan apr. 2006409 inlägg
#1

Jag har följande kod:

$sql = mysql_query("SELECT * FROM resultat WHERE month = $month AND user = $user AND kontroll = 'ok!'") or die(mysql_error("Det gick inte att nå tabellen 'reslutat'"));
$spec = array();
$i = 0;
while($resultat = mysql_fetch_array($sql)){
	$klient = $resultat['klient'];
	$produkt = $resultat['produkt'];
	$produkter = explode(' - ', $produkt);
	$rows = count($produkter); 

	for ($a = 0; $a <= $rows; $a++){  //Här i loopen får jag problem tror jag
		$c = $c+$a;  // Jag vill att explode:en klistras in i array:en utan att de skrivs över av kommande indexnr. 
		$spec[$c][0] = $klient;  //$c ska alltså fortsätta på $a+$c när $a st värden har skrivits in i array:en. Nu verkar det som att de bara skrivs över 
		$spec[$c][1] = $produkter[$a]; // Den här inklistringen tycks bli fel.

	} 
$i++;
}

Jag hoppas att det går att förstå vad jag ivll göra mha att läsa förklaringarna i koden.

edit: Problemet jag har nu är att jag helatiden får en för mycket i slutet. Alltid en, vad är fel.

The_HulkMedlem sedan juni 20031 837 inlägg
#2

du ska nog inte ha <= i din for-loop

for ($a = 0; $a <= $rows; $a++){  //Här i loopen får jag problem tror jag

utan bara <

for ($a = 0; $a < $rows; $a++){  //Här i loopen får jag problem tror jag
The_HulkMedlem sedan juni 20031 837 inlägg
#3

hmm, när jag tittar efter lite noggrannare så ser jag att du deklarerar $spec = array() men sen använder du $spec[...][...]

du måste skapa en array för varje $spec[...]

    for ($a = 0; $a <= $rows; $a++){  //Här i loopen får jag problem tror jag
        $c = $c+$a;  // Jag vill att explode:en klistras in i array:en utan att de skrivs över av kommande indexnr. 
        $spec[$c] = array();
The_HulkMedlem sedan juni 20031 837 inlägg
#4

du initierar aldrig $c utan använder den direkt

$c = $c+$a;  // Jag vill att explode:en klistras in i array:en utan att de skrivs över av kommande indexnr.

Du ska initiera den först innan du använder den.

om du ger oss ett exempel på hur du vill att de ska se ut så kanske det är lättare att förstå.

überfuzzMedlem sedan apr. 2006409 inlägg
#5

Okej, här kommer lite exempel på vad som hamnar i array:en. Varför löper inte indexnummrena i ordning, 0,1,2,3,4,5,6,osv. Vidare varför får jag alltid en på slutet utan Produkt, den borde inte vara där, i alla fall om man ser till sql-tabellen.

Array
(
[0] => Array
(
[0] => Klient1
[1] => Produkt1
)

\[1\] =\> Array
    (
        \[0\] =\> Klient2
        \[1\] =\> Produkt2
    )

\[2\] =\> Array
    (
        \[0\] =\> Klient2
        \[1\] =\> Produkt2
    )

\[3\] =\> Array
    (
        \[0\] =\> Klient2
        \[1\] =\> Produkt3
    )

\[4\] =\> Array
    (
        \[0\] =\> Klient2
        \[1\] =\> Produkt4
    )

\[6\] =\> Array         //Lite här och där köper inte index i talföljd.
    (
        \[0\] =\> Klient2
        \[1\] =\>                  //Här dyker det alltid upp en extra.
    )

)

nitro2k01Medlem sedan aug. 20039 342 inlägg
#6
$sql = mysql_query("SELECT * FROM resultat WHERE month = $month AND user = $user AND kontroll = 'ok!'") or die(mysql_error("Det gick inte att nå tabellen 'reslutat'")); 
$spec = array(); 

while($resultat = mysql_fetch_array($sql)){ 
    $klient = $resultat['klient']; 
    $produkt = $resultat['produkt']; 
    $produkter = explode(' - ', $produkt); 
    $rows = count($produkter); 

    for ($a = 0; $a < $rows; $a++){
        $spec[] = array(
            'klient' => $resultat['klient'],
            'produkt' => $produkter[$a]
        );
    } 
}

// Notera att klient resp. produkt nu koms åt med bokstavsindex, inte sifferindex
echo $spec[4]['klient'];    // Denna rad bör skriva ut Klient2 utifrån datat du anger i inlägget ovan.
nitro2k01Medlem sedan aug. 20039 342 inlägg
#7

The_Hulk skrev:

hmm, när jag tittar efter lite noggrannare så ser jag att du deklarerar $spec = array() men sen använder du $spec[...][...]

du måste skapa en array för varje $spec[...]

Fel. PHP har en väldigt lössläppt array-hantering. Följande är exempelvis fullt giltigt PHP, och skriver ut talet 8.

$x[]=5;

$x[][][3]=8;

echo $x[1][0][3];

The_Hulk skrev:

du initierar aldrig $c utan använder den direkt

$c = $c+$a;  // Jag vill att explode:en klistras in i array:en utan att de skrivs över av kommande indexnr.

Du ska initiera den först innan du använder den.

Fel igen. Visst är det bra att initiera, och vissta kan jag hålla med om att überfuzz' kod innehåller fel, men trots det behöver man inte göra det, utan odeklarerade variabler antar värdet 0, "" eller array(), beroende på vad som är lämpligt för den operation som utförs, och deklareras sen som globala variabler. überfuzz' problem beror inte på oinitierade variabler, utan feltänk. Observera exempelvis följande kod, som skriver ut värdet 5 "som väntat".

$x=5;

while($x--){
	$i++;
}

echo $i;
überfuzzMedlem sedan apr. 2006409 inlägg
#8

Okej, tack!

När jag ser din kod kan jag bara konstatera att det var det jag ville göra, men inte klarade.

Frågor, av en som inte kan phparrayfunktioner:
1. Vad är det för fördel med att ha bokstavsindex framför sifferindex?
2. Finns det någon phpfunktion som plockar fram hur många det finns av varje unik kombination av variabler i arrayerna?
3. Finns det någon php-funktion som tar bort alla upprepningar av unika kombinationer?

nitro2k01Medlem sedan aug. 20039 342 inlägg
#9

1. Bara läsbarheten av programmet.
2. Vet ej... Annars får man skriva en
3. http://se.php.net/function.array-unique kanske, inte helt säker på hur den fungerar om föremålen i arrayen själva är arrayer.

überfuzzMedlem sedan apr. 2006409 inlägg
#10

count_chars verkar göra tricket:

http://se.php.net/manual/sv/function.count-chars.php

124 ms totalt · 3 externa anrop · v20260731065814-full.2b84b982
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
122 ms — hämta tråd, inlägg och bilagor (db)