FAQ |
Kalender |
![]() |
#1 | |||
|
||||
Mycket flitig postare
|
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. ![]() |
|||
![]() |
![]() |
![]() |
#2 | |||
|
||||
Mycket flitig postare
|
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])) |
|||
![]() |
![]() |
![]() |
#3 | |||
|
||||
Mycket flitig postare
|
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; } |
|||
![]() |
![]() |
![]() |
#4 | |||
|
||||
Mycket flitig postare
|
Ä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
![]() |
|||
![]() |
![]() |
![]() |
#5 | |||
|
||||
Mycket flitig postare
|
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. ![]() |
|||
![]() |
![]() |
![]() |
#6 | |||
|
||||
Mycket flitig postare
|
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:
|
|||
![]() |
![]() |
![]() |
#7 | |||
|
||||
Mycket flitig postare
|
smart, sådär kan man ju också göra... Du är inte dum du inte.
Respekt till MMC ![]() |
|||
![]() |
![]() |
Svara |
|
|