ugrás a tartalomhoz

Asszociatív tömb elemének cseréje, adott feltételtől függően

kalamona · 2006. Szep. 16. (Szo), 23.27
Sziasztok!

Mára ez már a sokadik kérdésem lesz, de egyszerűen nagyon jók vagytok, lassan több sportszelettel jövök itt már a társaságnak. :)

szitu #1:
Lekérdezés visszaad egy asszociatív tömböt. Igen ám, de én nem azt szeretném kiiratni hogy "Tagság: 3", hanem azt hogy "Tagság: Bronzfokozatú", viszont a táblában kódokkal van jelölve a dolog.

szitu #2
Mező Numerikus értéke alapján szeretnék képet, gombot, formalkatrészt kitenni.

Az volt a tervem, hogy mikor jönnek az adatok a lekérdezésből
mysql_fetch_array bevetésével, rögtön megejtek a sorokon egy cserét is. Mi erre a legjobb módszer?

$resultrow=array("nev"="Béla","statusz"=>"6","polomeret"=>"XL");
$modifier=array("statusz");
$modifier["statusz"]["original"]=6;
$modifier["statusz"]["replacement"]="Aranyfokozatú törzstag";
array_map("replace",$resultrow,$modifier);
Na valami ilyenre gondoltam sacc/kábé. Hogyan kell ezt elegánsan? Nem akarok külön táblát a rangoknak, idegenkulcsokkal!
Egyébként is univerzális varázsfüggvényre gondoltam.
Olyat is meg tudna oldani a kis okos, hogy adott mezőértékek esetén más formelemeket pakoljon ki a képernyőre, vagy egy szállásfoglalásnál, a "függő" státusz esetén egy "jóváhagyás" gombot mutatunk egyébként pedig a "lefoglalva" feliratot stb.

na mutatok még kódot, hogy rendesen bele tudjátok élni magatokat:

function dbQueryRows($result, $replace=array(),$callback="replacer")
 	{
	function replacer($original,$replacer)
		{ // ide jönne a szimpla mechanikus csere értékstimmelés esetén
		}
	$resultArray=FALSE;
	while($row = mysql_fetch_array($result, MYSQL_ASSOC))
		{
		if (!empty($replace)) array_map("replacer",$row,$replace);
		$resultArray[] = $row;
		}
	return $resultArray;
	}

Alapban visszadná a lekérdezés eredményét minden varia nélkül, ha kap egy tömböt cserél, ahogy mondtam, ha még függvényt is megadok akkor bonyulultabb feltételektől függő cserét is tudna csinálni.
Csak éppen fogalmam sincs hogyan lenne ez jó. Egyáltalán
array_map, vagy array_walk, vagy egyik sem? az array_map-nál gondjaim vannak a kulcsok visszaadásával.

Mi lesz velem most?
 
1

Adatok és nézetek szétválasztása

pp · 2006. Szep. 17. (V), 08.50
fordító tömb:

<?php
$fordit_fokozat = array(1 => 'vas fokozat', .... ,6 => 'Aranyfokozatú törzstag');

$resultrow['statusz']=$fordit_fokozat[$resultrow[statusz]];
?>
Azonban én javasolnám szétválasztani a megjelenítést a kódtól. Valószínűleg amikor eldöntöd, hogy mi hol jelenjen meg, akkor a számra (6) van szükségetd, és pusztán akkor van szükséged a szövegre (Aranyfokozatú törzstag) amikor megjeleníted a statuszt a felhasználónak. Tehát a cserét kizárólag a kiíratás előtt ejteném meg. Ekkor nem kell állandóan cipelned teljesen feleslegesen a szöveget.

pp
2

kreatív kommandó lecsap :))) avagy Varázsfüggvény I.

toxin · 2006. Szep. 17. (V), 09.24

<?php

function nev($param){
    return $param;
}

function statusz($param){
    $replacer = array(
        '6'=>'Aranyfokozatú törzstag'
    );
    
    return $replacer[$param];
}

function polomeret($param){
   return $param;
}


$resultrow=array("nev"=>"Béla","statusz"=>"6","polomeret"=>"XL");
$resultrow = array_map(create_function('$a,$b','return $a.\'=>\'.$b;'),array_keys($resultrow),array_values($resultrow));
$resultrow = preg_replace('/(.+?)(=>)(.+?)/e',"call_user_func('\\1','\\3');",$resultrow);

print_r($resultrow);
?>
http://toxin.hu/weblabor/replacer.php
http://toxin.hu/weblabor/replacer.txt

magyarán a tábla szerinti oszlopnévvel mint függvénnyel eljátszuk a cserét (ha kell) az egyes elemeken, lehetne még szórakozni vele, de az már a fenti megoldás mutálása lenne (már nem kihívás nem kell ötlet nem érdekel :)) )

további jó szórakozást :)

üdv t
3

no még egy, nem kulcselnyelős változat

toxin · 2006. Szep. 17. (V), 09.58

<?php

function nev($param){
    return $param;
}

function statusz($param){
    $replacer = array(
        '6'=>'Aranyfokozatú törzstag'
    );
    
    return $replacer[$param];
}

function polomeret($param){
   return $param;
}


$resultrow=array("nev"=>"Béla","statusz"=>"6","polomeret"=>"XL");
array_walk($resultrow,create_function('&$v,$k',' $v = call_user_func($k,$v);'));

print_r($resultrow);
?>
eszembe jutott mi volt a baj az array_map -al tényleg elnyeli a kulcsokat, lecsérltem array_walk-ra preg-se kell már

http://toxin.hu/weblabor/replacer2.php
http://toxin.hu/weblabor/replacer2.txt

üdv t :)

ui: persze lehetne egy függvényt hívni 2 param-al és switch-case -el cserélni stb. :)
4

a macskarúgja meg ez tényleg működik

kalamona · 2006. Szep. 17. (V), 11.00
Elegáns varázslat. Az enyém parasztosabb lett, meg ma már nem is tetszik annyira, mint hajnal 4-kor...
Úgyhogy nagyon jól jött ez az ihlet most. Összeházasítom a sajáttal, ebből tankönyvbe való megoldás lesz.:)
Szerintem még jelentkezem.

Le a kalappal.
5

A történet folytatódik...

kalamona · 2006. Szep. 17. (V), 11.39
Filozofikus kérdések jönnek, készüljetek:

Paradigmaváltás küszöbén állok.

filo #1:
Eddig úgy csináltam lekérdezések feldolgozását, hogy egy tömböt gyártottam, amiben benne volt az összes fetch_array-el visszadott sor. Utána ezzel dolgoztam. Van táblázat generáló fv-em, adatlapgeneráló fv-em satöbbi, ezek általában ebből a nyers adat tömbből dolgoznak.

Array
(
    [0] => Array
        (
            [fogl_datum] => 2006-09-13 22:41:26
            [nev] => aaa
            [telefon] => aaa
            [email] => aaa
            [polo] => S
        )

    [1] => Array
        (
            [fogl_datum] => 2006-09-14 10:20:21
            [nev] => j
            [telefon] => j
            [email] => j
            [polo] => S
        )

    [2] => Array
        (
            [fogl_datum] => 2006-09-14 10:21:51
            [nev] => emoke
            [telefon] => 234234234
            [email] => xxxx##kukac##gmail.com
            [polo] => S
        )
Most viszont hogy nagyszabású feladatom támadt, elgondolkodtam, hogy lehet nem is vagyok én a szakma krémje ezzel a szokásommal. :)

Arra hajlok, hogy megpróbálom úgy megkomponálni az egész művet, hogy mindig csak az aktuális fetch_array által visszaadott sorral dolgozzanak a fv-ek. Így egyáltalán nem kell tárolnom az eredményhalmazt a memóriában, csak amig éppen csinálok valami az aktuális sorral. (Néhány speckó esetet leszámítva)

Kérdés: megéri-e szerintetek, vagy hagyjam a manóba, legjobban van ez így a világon?

filo #2:
A cseréket amiről az elején szóltam, hol szoktátok megtenni? Mert most belököm a majmot a vízbe. Azt eszeltem ki, hogy lesz egy nagy-nagy "validálóm". :)
A vezérhangyát Felhő hintette a fülembe:
a "Beérkező adatok ellenőrzése" -címszónál felskiccelt tömbjével.

Nem másoltam be, mert így is marha hosszú leszek, és utáltok majd nagyon.

ötlet: az adatbázis kezelőtől jövő adatokat pont úgy dolgozom fel, mint a felhasználótól jövőket, csak persze más "szabályok" szerint. Itt megtörténhet például a fent bevezetett csere probléma kezelése is.
Szumma:
soronként eredményfeldolgozás
 +
bemenőadatok szűrését végző fv- más szabályokkal a cserékre
 = virágos réten ugráló bolyhos báránykák, kerítés kolbászból
meg ilyenek?
Mondjátok meg veteránok, a frankót.
6

részemről az ADOdb

toxin · 2006. Szep. 17. (V), 11.59
ORM-jét (Object-Relation-Mapper) nézd meg, amit ebben ADOdb Active Record-nak hívnak, és objektumokkal dolgozz

http://phplens.com/lens/adodb/docs-active-record.htm

ill. volt egy elődádás phpConf-on
http://phpconf.hu/2005/media/eloadasok/adodb.pdf
további linkek ezen fent vannak

üdv t

ui: van belőle extension is ha ezirányú gondjaid lennének