webForumDet fria alternativet

Kolla värden i en array

23 svar · 756 visningar · startad av Bjuufaren

BjuufarenMedlem sedan okt. 2003108 inlägg
#1

Hej, det här är säkert jättelätt men jag har kollat runt i manualen utan att hitta något..

// dessa sätts i if-satser, de får ett värde eller så blir de "tomma"
$arr['key1'] = "value1";
$arr['key2'] = "";

// det här if-villkoret borde gå att förenkla
if ($arr['key1'] == "" && $arr['key2'] == "")
{
  // gör saker
}

Problemet är alltså att min $arr kan bli ganska stor, vilket gör villkoret i if-satsen kan bli gigantiskt långt.

MeleaMedlem sedan juli 20032 667 inlägg
#2

Hm, du kan inte köra såhär då?

if(empty($arr)) {
    // gör saker
}

Eller om du vill komma att $arr innehållet något värde kan du ta en titt på funktionen in_array().

BjuufarenMedlem sedan okt. 2003108 inlägg
#3

empty fungerar tyvärr inte (skulle fungera om jag aldrig sätter $arr[$key] == "")
in_array fungerar tyvärr inte heller riktigt.

MeleaMedlem sedan juli 20032 667 inlägg
#4

Jo men du vill ju kolla att alla $arr är tomma, och om så är fallet ska villkoret uppfyllas.
Eller?

BjuufarenMedlem sedan okt. 2003108 inlägg
#5
$arr['key1'] = '';
$arr['key2'] = '';

print empty($arr);

..ger ingen utskrift.

Med in_array kan jag kolla om "" finns i arrayen, visst, men jag vill kolla om alla värden är "" (eller om något värde != "").

MeleaMedlem sedan juli 20032 667 inlägg
#6

Uhm, eftersom du definerar att $arr ska ha ett värde (även '' är ett värde) så funkar inte empty.
Testa istället något åt det här hållet:

if(strlen($arr) >= 1) {
   // gör något
}

Har ingen möjlighet att testa, sitter på jobbet.
Men hur blir resultatet om du kör...?

if(!isset($arr)) {
   // gör något
}
BjuufarenMedlem sedan okt. 2003108 inlägg
#7

strlen fungerar inte heller.. Kom på den här.. inte direkt självförklarande kod, men bästa lösningen ändå?

rsort($arr);
if (!$arr[0])
{
  //gör saker
}
MeleaMedlem sedan juli 20032 667 inlägg
#8

Bjuufaren skrev:

strlen fungerar inte heller.. Kom på den här, kanske bästa lösningen då?

rsort($arr);
if (!$arr[0])
{
  //gör saker
}

Jao, testa om min uppdatering funkar, annars funkar din lösning utmärkt. :)

BjuufarenMedlem sedan okt. 2003108 inlägg
#9

isset fungerar nog inte av samma anledning som empty.
Hmm, min lösning är inte klockren ändå, jag vill ju ha kvar nycklarna i arrayen, vilket gör att jag måste skapa en kopia av den först. Funkar, men känns onödigt komplicerat.

MeleaMedlem sedan juli 20032 667 inlägg
#10

Svårt att hjälpa när man inte kan testa själv. :l
Funkar det inte att endast köra if(!$arr) då?

BjuufarenMedlem sedan okt. 2003108 inlägg
#11

if fungerar tyvärr inte heller. Det hade ju nästan varit för lätt. :)

Tack för att du försöker hjälpa i alla fall, alltid bra med lite nya tankar när man kört fast.

aasahMedlem sedan mars 20033 451 inlägg
#12
$tom = TRUE;
foreach ($arr as $t)
   if ($t != '') $tom = FALSE;
if ($tom) {
  //Do things
}

Borde funka. :)

MeleaMedlem sedan juli 20032 667 inlägg
#13

Jo, men då måste han köra en loop, tänkte först i samma banor.
Men det känns som det måste gå att lösa på ett enklare vis.

@ndersMedlem sedan juni 200026 914 inlägg
#14

Jag kan inte php, så jag vet inte om det finns ett bättre sätt, men ett förslag:

if (implode("", $arr)=="") {
	// tomt utav bara helskotta!
}

Mvh

aasahMedlem sedan mars 20033 451 inlägg
#15

Melea skrev:

Jo, men då måste han köra en loop, tänkte först i samma banor.
Men det känns som det måste gå att lösa på ett enklare vis.

:q Antingen kör han loopen synligt, eller så anropar han en funktion i PHP som troligen är implementerad som en loop - vad är skillnaden? Bortsett ifrån om det fungerar eller ej?

Att isSet och empty inte funkar beror ju på att värdena är satta.

@nders, vad gör implode? :q Han vill ju inte bli av med satta verkliga värden.

MeleaMedlem sedan juli 20032 667 inlägg
#16

Iofs, nog jag som är trött på morgonknuten. :OO

MatteMedlem sedan aug. 20002 970 inlägg
#17

Jag funderar om det går att göra något med array_count_values().
Har ingen möjlighet att testa själv, men vad händer om du gör så här ?

$check = array_count_values($arr);
if (isset($check['']) && count($check) == 1) {
   // Arrayen består bara av tomma värden
}

Om det inte fungerar, kör en print_r() på $check, och se vad den ger. Då borde man kunna se hur man ska ändra sin if-sats för att få det att fungera.

[EDIT]
Såg nu @nders variant.
Den är den helt rätta. Har man bara tomma värden ger implode en tom sträng.
Då hans implode heller inte tilldelas till någon variabel, påverkas heller inte arrayen.

@ndersMedlem sedan juni 200026 914 inlägg
#18

@nders, vad gör implode?

Implode klistrar ihop alla platser i arrayen till en sträng, med given separator (ingen i detta fall). Ingen förändring görs på arrayen, utan en ny sträng skapas (som i det här fallet bara används för att jämföra.).

Mvh

BjuufarenMedlem sedan okt. 2003108 inlägg
#19

@anders förslag funkade klockrent. Är nog den smidigaste lösningen. Tack för hjälpen allihopa. :)

aasahMedlem sedan mars 20033 451 inlägg
#20

@nders och Matte - vad vinner man på era förslag jämfört med att löpa igenom arrayen för hand? Båda förslagen måste väl också löpa igenom arrayen och göra lite mer dessutom? Eller? Handlar det mer om kortare kod?

Jag vill gärna förstå vad skillnaden är. :q

Bjuufaren - markera @nders svar som löst! :)

Genererad på 375 ms · cache AV · v20260730165559-full.f96bc7eb