Kom ihåg mig?
Home Menu

Menu


Snygg lösning för isset på flerdimensionell array?

Ämnesverktyg Visningsalternativ
Oläst 2008-04-11, 21:04 #1
totoos avatar
totoo totoo är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Nov 2006
Inlägg: 730
totoo totoo är inte uppkopplad
Mycket flitig postare
totoos avatar
 
Reg.datum: Nov 2006
Inlägg: 730
Godkväll

Det är en sak jag har stört mig på när jag kodat php och har använt flerdimensionella arrayer där man inte vet alls vilka dimensioner som existerar.


Tänk att vi har en array som ser ut såhär

$arrayen[a][b][c];

Om jag vill veta om ett element i dimensionen c finns så kan jag skriva såhär:

if(isset($arrayen[1][5][0]))

Då vet jag om det finns ett element i dimension c.

Men om dimensionen b inte finns, då får jag en varning på undefined index 5 här (helt logiskt).

Så om jag utan att riskera en vaning ska se om det finns något i dimension c så måste jag kolla b först, alltså såhär:

if(isset($arrayen[1][5]) && isset($arrayen[1][5][0]))

Nu får jag ingen varning om dimension b inte finns, och allt är frid och fröjd.

(man ska även kolla element a på samma sätt, men utelämnar det)

Men om jag har barnsligt många dimensioner, typ 10st så blir denna ifsats sjukligt stor och ful.


Antar att någon känner igen besväret.
Om man skiter i varningar så är detta inget problem, men mina applikationer ger inte en enda varning av principskäl, så den lösningen går bort.

Att ändra koden ska vi heller inte diskutera, för det har inte med frågeställningen att göra.


Frågan är då, finns det något enklare sätt att göra detta? En isset för en array som inte bara tittar på sista dimensionen, utan hela hierarkin på vägen dit.

Egentligen tycker jag att man borde ta för givet att isset kontrollerar på det sättet, men så är det ju inte.


Man skulle kunna göra en funktion som tar arrayen som parameter, sedan en array med index, såhär:

function multiDimIsset($obj, $indices)
{
// nån foreach med indices som använder eval
}

$isset = multiDimIsset($arrayen, array(1,5,0));

och att den tittar allt internt, men om någon känner till en snyggare lösning (som nästan måste finnas) så vill jag se en sådan.
totoo är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-04-11, 21:29 #2
MMCs avatar
MMC MMC är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jan 2008
Inlägg: 560
MMC MMC är inte uppkopplad
Mycket flitig postare
MMCs avatar
 
Reg.datum: Jan 2008
Inlägg: 560
Utan att veta om det du efterfrågar existerar så säger jag att den enklaste lösningen för att hålla din kod varningsfri och samtidigt slippa att loopa över varje dimension är helt enkelt att ignorera varningar på just det isset-anropen, som så:
if(@isset($arrayen[1][5][0]))
MMC är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-04-11, 21:40 #3
totoos avatar
totoo totoo är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Nov 2006
Inlägg: 730
totoo totoo är inte uppkopplad
Mycket flitig postare
totoos avatar
 
Reg.datum: Nov 2006
Inlägg: 730
Jo, men vill undvika det också, även om det är en helt godkänd lösning så tycker jag inte om att varningar genereras, även om de "kvävs" i detta fallet (jag är ganska hardcore c++kodare, så sånt ger mig alltså sömnsvårigheter).

Men jag blev så otålig att jag skrev en funktion som löser det, enligt mitt exempel ovan, men jag slutar gärna använda den om någon kommer med något bättre.

Delar med mig:

Kod:
function multiDimIsset($theArray, $dimensions)
{
	$testObj = '$theArray';
	foreach($dimensions as $dim)
	{
 *$testObj .= "[$dim]";

 *if(!eval('return isset(' . $testObj . ');'))
 *	return false;
	}
	return true;
}
totoo är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-04-11, 21:45 #4
MMCs avatar
MMC MMC är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jan 2008
Inlägg: 560
MMC MMC är inte uppkopplad
Mycket flitig postare
MMCs avatar
 
Reg.datum: Jan 2008
Inlägg: 560
Ärligt talat så tycker jag nog bättre om att kväva en varning jag vet är ofarlig än att introducera onödiga loopar... Men allt beror ju på smaken och hur ofta koden ska köras
MMC är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-04-11, 21:47 #5
totoos avatar
totoo totoo är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Nov 2006
Inlägg: 730
totoo totoo är inte uppkopplad
Mycket flitig postare
totoos avatar
 
Reg.datum: Nov 2006
Inlägg: 730
en loop på typ 3-5 (tror inte jag behöver fler) iterationer är ju inget som känns, så själva loopen är ju inget som genererar märkbar tid, då är det snarare eval som är seg, men detta går nog så fort att vi talar om miljondels, eller mindre delar av en sekund (men har inte klockat).

Den loopar ju inte igenom själva "isset-arrayen", utan den gör ju en isset per dimension.

Men jag köper ditt argument, men som min edit i början av förra inlägget så gör det ont att lösa problemet så, även om det kanske är bäst. (erkänner det störda i sammanhanget)
totoo är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-04-12, 12:33 #6
MMCs avatar
MMC MMC är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Jan 2008
Inlägg: 560
MMC MMC är inte uppkopplad
Mycket flitig postare
MMCs avatar
 
Reg.datum: Jan 2008
Inlägg: 560
Jag skrev en snabbare funktion som inte använder eval, jag testade lite snabbt och den verkar köra ungefär 5 ggr snabbare än med eval.
Citat:

function multiDimIsset($theArray, $dimensions)
{
foreach($dimensions as $dim)
{
if (!isset($theArray[$dim])) {
return false;
}
$theArray = $theArray[$dim];
}
return true;
}
MMC är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-04-12, 13:53 #7
totoos avatar
totoo totoo är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Nov 2006
Inlägg: 730
totoo totoo är inte uppkopplad
Mycket flitig postare
totoos avatar
 
Reg.datum: Nov 2006
Inlägg: 730
smart, sådär kan man ju också göra... Du är inte dum du inte.

Respekt till MMC
totoo är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 00:43.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017