/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Kompleks, rekursiv opbygning af array
Fra : Jens Thomsen


Dato : 25-12-07 10:23

Indledningsvis, dette indlæg bliver en smule langt og komplekst

Jeg har en tabel med konfigurationsdata.
Dette data skal rekursivt bygges op til et array.

Arrayet skal ende med at se sådan ud:

$arr ['modules'] ['allowed_modules'] [0] = 'images';
$arr ['modules'] ['allowed_modules'] [1] = 'sounds';

$arr ['jewellery'] ['2007_collection'] ['images'] [0] = 'img01.jpg';
$arr ['jewellery'] ['2007_collection'] ['images'] [1] = 'img02.jpg';
$arr ['jewellery'] ['2007_collection'] ['thumbnails'] [0] = 'img01.jpg';
$arr ['jewellery'] ['2007_collection'] ['thumbnails'] [1] = 'img02.jpg';

Pointen er altså at jeg kan modellere fra key->value til key->[masse
key's]->key->value.


Der er således behov for rekursivt at bygge indexet i arrayet op og det er
der jeg kommer til kort.


Jeg har lavet nedenstående kode, som ikke er kørt da den ikke vil fungere.
config_SNO er en fremmednøgle der peger på tabellen selv.


Er der nogen der kan komme med nogle pointers til hvordan pokker jeg kommer
videre?





$arr_complete = fetch_config (0);

function fetch_config ($config_SNO)
{
$SQL = "

SELECT config_SNO,
key,
value

FROM config

WHERE config_SNO = '". $config_SNO ."'

";

$data = mysql_query ($SQL) or die (mysql_error());
while ($hr = mysql_fetch_array ($data, MYSQL_ASSOC))
{
$key = $hr ["key"];
$value = $hr ["value"];
$config_SNO = $hr ["config_SNO"];

if ($config_SNO)
{
# Defekt del!
$arr [$key] = fetch_config ($config_SNO);
}
else
{
$arr [$key] = $value;
}
}

return $arr;
}






CREATE TABLE `config` (
`SNO` int(10) unsigned NOT NULL auto_increment,
`config_SNO` int(10) unsigned default NULL,
`key` varchar(255) NOT NULL,
`value` text,
PRIMARY KEY (`SNO`),
KEY `config_SNO` (`config_SNO`)
) ENGINE=MyISAM AUTO_INCREMENT=11 DEFAULT CHARSET=latin1;



INSERT INTO config (SNO, config_SNO, `key`, value) VALUES
('1',NULL,'modules',NULL);
INSERT INTO config (SNO, config_SNO, `key`, value) VALUES
('2','1','allowed_modules','images');
INSERT INTO config (SNO, config_SNO, `key`, value) VALUES
('3','1','allowed_modules','sounds');
INSERT INTO config (SNO, config_SNO, `key`, value) VALUES
('4',NULL,'jewellery',NULL);
INSERT INTO config (SNO, config_SNO, `key`, value) VALUES
('5','4','2007_collection',NULL);
INSERT INTO config (SNO, config_SNO, `key`, value) VALUES
('6','5','images','img01.jpg');
INSERT INTO config (SNO, config_SNO, `key`, value) VALUES
('7','5','images','img02.jpg');
INSERT INTO config (SNO, config_SNO, `key`, value) VALUES
('8','5','thumbnails','img01.jpg');
INSERT INTO config (SNO, config_SNO, `key`, value) VALUES
('9','5','thumbnails','img02.jpg');



 
 
Andreas Andersen (28-12-2007)
Kommentar
Fra : Andreas Andersen


Dato : 28-12-07 22:46


"Jens Thomsen" <jt@nej.nej> wrote in message
news:4770cbda$0$90270$14726298@news.sunsite.dk...
> Indledningsvis, dette indlæg bliver en smule langt og komplekst
>
> Jeg har en tabel med konfigurationsdata.
> Dette data skal rekursivt bygges op til et array.
>
> Arrayet skal ende med at se sådan ud:
>
> $arr ['modules'] ['allowed_modules'] [0] = 'images';
> $arr ['modules'] ['allowed_modules'] [1] = 'sounds';
>
> $arr ['jewellery'] ['2007_collection'] ['images'] [0] = 'img01.jpg';
> $arr ['jewellery'] ['2007_collection'] ['images'] [1] = 'img02.jpg';
> $arr ['jewellery'] ['2007_collection'] ['thumbnails'] [0] = 'img01.jpg';
> $arr ['jewellery'] ['2007_collection'] ['thumbnails'] [1] = 'img02.jpg';
>
> Pointen er altså at jeg kan modellere fra key->value til key->[masse
> key's]->key->value.
>
>
> Der er således behov for rekursivt at bygge indexet i arrayet op og det er
> der jeg kommer til kort.
>
>
> Jeg har lavet nedenstående kode, som ikke er kørt da den ikke vil fungere.
> config_SNO er en fremmednøgle der peger på tabellen selv.

Jeg havde lidt problemer med at få det til at virke mod min MySQL database,
men jeg ved ikke om du bruger MySQL, og har de samme problemer. Jeg kan ikke
have et felt med navnet "key" og NULL er ikke lig 0. Det har jeg rettet i
nedenstående som virker for mig:

$arr_complete = fetch_config ("NULL");

function fetch_config ($config_SNO)
{
if ($config_SNO == "NULL") {
$SQL = "SELECT SNO, config_SNO, thekey, value FROM config WHERE
config_SNO IS NULL";
} else {
$SQL = "SELECT SNO, config_SNO, thekey, value FROM config WHERE
config_SNO = ". $config_SNO;
}
echo $SQL . "<br>";

$data = mysql_query ($SQL) or die (mysql_error());
$arr = array();
while ($hr = mysql_fetch_array ($data, MYSQL_ASSOC))
{
$key = $hr ["thekey"];
$value = $hr ["value"];
$SNO = $hr ["SNO"];
if (!$value)
{
$arr [$key] = fetch_config ($SNO);
}
else
{
if (!$arr[$key]) {
$arr[$key] = array();
}

$arr[$key][sizeof($arr[$key])] = $value;
}
}

return $arr;
}

--
Andreas


Jens Thomsen (29-12-2007)
Kommentar
Fra : Jens Thomsen


Dato : 29-12-07 14:36


> Jeg havde lidt problemer med at få det til at virke mod min MySQL
> database,
> men jeg ved ikke om du bruger MySQL, og har de samme problemer. Jeg kan
> ikke have et felt med navnet "key" og NULL er ikke lig 0. Det har jeg
> rettet i nedenstående som virker for mig:


Ah ja, det er fordi key er reserveret og skal i `key`, NULL blev bare ændret
til at defaulte til 0 i databasen.


> if (!$arr[$key]) {
> $arr[$key] = array();
> }
>
> $arr[$key][sizeof($arr[$key])] = $value;


Det virkede faktisk rigtigt godt
Og væsentligt simplere end min eval() tilgang.

Jeg er dog lidt i tvivl om den kan have flere nestede arrays i sig?
A la:
$x [level1] [level2] [level3] = Y;

Jeg tror også den i ovenstående tilfælde smider den eksisterende
streng-værdi væk og kun gemmer de efterfølgende, men det skal der lige
testes på

Mange tak for hjælpen, nu kan jeg komme en del videre!



Andreas Andersen (30-12-2007)
Kommentar
Fra : Andreas Andersen


Dato : 30-12-07 00:56


"Jens Thomsen" <jt@nej.nej> wrote in message
news:47764d1b$0$90272$14726298@news.sunsite.dk...
>> if (!$arr[$key]) {
>> $arr[$key] = array();
>> }
>>
>> $arr[$key][sizeof($arr[$key])] = $value;

Jeg kommer lige til at se, at de 3 første linier i ovenstående slet ikke er
nødvendige . If-delen skal altså bare være:

if (!$value)
{
$arr [$key] = fetch_config ($SNO);
}
else
{
$arr[$key][sizeof($arr[$key])] = $value;
}

I øvrigt er første del af if-sætningen også ændret. if($config_SNO) er
blevet til if($value) og fetch_config($config_SNO) til fetch_config($SNO) da
$config_SNO for underniveauerne er $SNO for det niveau der kaldes rekursivt
for.

> Det virkede faktisk rigtigt godt
> Og væsentligt simplere end min eval() tilgang.
>
> Jeg er dog lidt i tvivl om den kan have flere nestede arrays i sig?
> A la:
> $x [level1] [level2] [level3] = Y;
>
> Jeg tror også den i ovenstående tilfælde smider den eksisterende
> streng-værdi væk og kun gemmer de efterfølgende, men det skal der lige
> testes på

I det eksempel du angav får jeg med en print_r($arr_complete) følgende, som
vel er som arrayet skal se ud?

Array
(
[modules] => Array
(
[allowed_modules] => Array
(
[0] => images
[1] => sounds
)
)
[jewellery] => Array
(
[2007_collection] => Array
(
[images] => Array
(
[0] => img01.jpg
[1] => img02.jpg
)
[thumbnails] => Array
(
[0] => img01.jpg
[1] => img02.jpg
)
)
)
}

--
Andreas


Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408924
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste