ugrás a tartalomhoz

többdimenziós tömb in_array vizsgálata

mokat · 2009. Okt. 20. (K), 12.01
Sziasztok,

meg szeretném oldani, hogy ne legyen duplikáció egy tömbben, mégpedig úgy, hogy amikor töltöm fel a tömböt vizsgálja meg, hogy létezett-e már ilyen bejegyzés.

vizsgálandó tömb:

$_SESSION['sor'][] = array (
"esemeny" => $_POST['meccs'],        
"kimenetel" => $_POST['tipp'],
);
vizsgálat:

if (in_array($_POST[meccs], $_SESSION['sor'])) 
{
print "Már szerpel a tömbben!";
} 
de már próbáltam ezerféleképpen, vagy nem csinált semmit, vagy mindig TRUE lett az if, vagy "Warning: in_array() [function.in-array]: Wrong datatype for second argument in"

pl.:

if (in_array(array('esemeny' => $_POST[meccs], 'kimenetel' => $_POST[tipp]), $_SESSION['sor'])) 
{
print "Már szerpel a tömbben!";
}
előre is köszi!
 
1

...

carstepPCE · 2009. Okt. 20. (K), 12.28
igy nem hasznalhatod az in_array-t, tombot nem adhatsz meg mint keresesi feltetelt, tudtommal. Persze eloszor a logikat kene felepitened, hogy egy meccsre egy felhasznalo hany tippet adhat meg, mert igy akar eleg, ha a meccsre keresel ra, ha az szerepel, akkor nem engeded be. Es mi van akkor, ha modositani akarja a meccs tippjet es igy tovabb. Tudom itt errol nem volt szo, es nem is szerepel hasonlo logika a kododban, csak hatha. Egyebkent nem marad mas hatra, mint soronkent vegigmenni a $_SESSION['sor'] ertekein es megvizsgalni, ha talalt, akkor break-t vagy return true;-t hasznalni, ahogy jol esik.

Udv
Sanyi
2

Én sem értem pontosan,

Thoer · 2009. Okt. 20. (K), 12.50
hogy mi is a feladat, de ha jól sejtem, akkor a felhasználó egy meccsre egyszer tippelhet és az adott tippeket szeretnéd elmenteni a $_SESSION tömb 'sor' nevű tagjába. Remélem nem dolgozol közvetlenül a felhasználó adatain, az csak illusztráció volt...

Azért biztos ami biztos írjuk le:
Szóval legyen $meccs a $_POST['meccs'] leellenőrzött értéke, ami azonosítója is a meccsnek, illetve $tipp a $_POST['tipp'] leellenőrzött értéke, ami a program logikájától függően lehet bármi.

Ebben az esetben ha tárolod a beérkezett adatokat, hogy $_SESSION['sor'][$meccs] = $tipp, akkor a létezést ennyi leellenőrizni:
if (isset($_SESSION['sor'][$meccs])){...}
3

Ez milyen? if

gphilip · 2009. Okt. 20. (K), 14.55
Ez milyen?

if (!is_array($_SESSION['sor'])) {
	$_SESSION['sor']=array();
}

$_SESSION['sor'][] = array (  
	"esemeny" => $_POST['meccs'],          
	"kimenetel" => $_POST['tipp'],  
);  

$_SESSION['sor']=array_unique($_SESSION['sor']);
4

Nem jó

Thoer · 2009. Okt. 20. (K), 16.43
Az array_unique nem fog több dimenziós tömbre működni, ráadásul amúgy is lassú. Bár semeddig nem tart egy tömb dimenzióra is működő verziót írni, de ha a $_POST['meccs'] egyértelműen azonosítja a meccset, akkor ez amúgy is fölösleges, ha nem akkor meg erősen kétséges, hogy mennyire van jól megtervezve szoftver.
5

Hm...

gphilip · 2009. Okt. 20. (K), 17.12
Lehet, hogy félreértettem a problémát. Ha az a lényeg, hogy egy meccsre ne legyen több tipp (és nem az, hogy ne legyenek ugyanolyan meccs-tipp párok), akkor egészen egyszerűen fest:

if (!is_array($_SESSION['sor'])) {  
    $_SESSION['sor']=array();  
}  

if (!array_key_exists($_POST['meccs'], $_SESSION['sor']) {
    $_SESSION['sor'][$_POST['meccs']] = $_POST['tipp'];
}
Ahogy te is Írtad fentebb.
6

megoldás

mokat · 2009. Okt. 21. (Sze), 14.21
gphilip ---> array_key_exist() szerintem nem megy többdimenziós tömböknél, ahogy az array_unique-se (ahogy én tapasztaltam, de ez szubjektív, nem releváns:) De köszi neked is!

végül is végigpörgetem a tömböt és kirakom az eseményeket és úgy vizsgálom át, persze előtte csekkolom, hogy nem üres-e a tömb, mert akkor csúnya hibaüzenetet kapok:

if (count($_SESSION['sor']) != NULL)
{
foreach ($_SESSION['sor'] as $values) $esemeny[] = $values["esemeny"];
if (in_array($_POST[meccs], $esemeny))   
{print "Már megjátszottad az eseményt!";}
}
7

Nem több dimenziós

gphilip · 2009. Okt. 21. (Sze), 15.05
Hali!

Az én megoldásom - ahogy Thoeré sem - nem használ több dimenziós tömböt! Pont ez a lényeg!

A kÍvánt eredményt elérheted egydimenziós tömbbel, és Így nem bonyolÍtod a saját életed és némi overhead-et is megspórolsz!
8

már értem

mokat · 2009. Okt. 22. (Cs), 10.59
:)