/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Omvendt udtrækning fra array
Fra : Kim Ludvigsen


Dato : 05-10-10 06:12

Jeg vil gerne have en omvendt funktion af et array. Normalt
kan man hente en værdi i et array som fx:
echo $mit_array[5]; // resultat: banan
Jeg vil i stedet gerne hente nummeret ud fra værdien, altså
noget i stil med:
echo $mit_array[banan]; // resultat: 5

Hvordan opnår jeg det ønskede?

--
Mvh. Kim Ludvigsen
Undgå virus og andet snavs på computeren:
http://pc-sikkerhed.dk

 
 
Birger Sørensen (05-10-2010)
Kommentar
Fra : Birger Sørensen


Dato : 05-10-10 06:25

Kim Ludvigsen har bragt dette til verden:
> Jeg vil gerne have en omvendt funktion af et array. Normalt kan man hente en
> værdi i et array som fx:
> echo $mit_array[5]; // resultat: banan
> Jeg vil i stedet gerne hente nummeret ud fra værdien, altså noget i stil med:
> echo $mit_array[banan]; // resultat: 5
>
> Hvordan opnår jeg det ønskede?

$key = -1; // eller en anden værdi, der ikke anvendes til key
$idx = 0;
while ( $key < 0) {
if ( $mit_array[ $key] == 'banan') { $key = $idx++; }
}
echo $key;

Eller noget i den retning.

Birger

--
http://varmeretter.dk - billig, sund og hurtig mad
http://bbsorensen.dk



Birger Sørensen (05-10-2010)
Kommentar
Fra : Birger Sørensen


Dato : 05-10-10 06:34

Birger Sørensen kom med følgende:
> Kim Ludvigsen har bragt dette til verden:
>> Jeg vil gerne have en omvendt funktion af et array. Normalt kan man hente
>> en værdi i et array som fx:
>> echo $mit_array[5]; // resultat: banan
>> Jeg vil i stedet gerne hente nummeret ud fra værdien, altså noget i stil
>> med:
>> echo $mit_array[banan]; // resultat: 5
>>
>> Hvordan opnår jeg det ønskede?
>
> $key = -1; // eller en anden værdi, der ikke anvendes til key
> $idx = 0;
> while ( $key < 0) {
> if ( $mit_array[ $key] == 'banan') { $key = $idx++; }
> }
> echo $key;
>
> Eller noget i den retning.
>
> Birger

Uendelig løkke.
Prøv
$key = -1; // eller en anden værdi, der ikke anvendes til key
$idx = 0;
while ( $key < 0) {
if ( $mit_array[ $key] == 'banan') { $key = $idx; }
$idx++;
}
echo $key;

i stedet.

Birger

--
http://varmeretter.dk - billig, sund og hurtig mad
http://bbsorensen.dk



Kim Ludvigsen (05-10-2010)
Kommentar
Fra : Kim Ludvigsen


Dato : 05-10-10 06:50

Birger Sørensen skrev::

>>> altså noget i stil med:
>>> echo $mit_array[banan]; // resultat: 5
>>>
>>> Hvordan opnår jeg det ønskede?

> Prøv
> $key = -1; // eller en anden værdi, der ikke anvendes til key ...

Birger, du er for hurtig til at svare. Jeg skulle til at
skrive, at jeg selv har fundet en løsning, og selvom den
ikke er helt, hvad jeg ledte efter, så er den god nok til
mit brug og mindre kompliceret end dit script.

$mit_array = array("æble" => "01", "pære" => "02", ...
"banan" => "05");

Men tak under alle omstændigheder!

--
Mvh. Kim Ludvigsen
Det nemmeste komma:
http://ordforklaring.dk/ordforklaring.php?forklaring=decimalkomma

Michael Rasmussen (05-10-2010)
Kommentar
Fra : Michael Rasmussen


Dato : 05-10-10 06:56

On Tue, 05 Oct 2010 12:49:48 +0700
Kim Ludvigsen <usenet@kimludvigsen.dk> wrote:

>
> $mit_array = array("æble" => "01", "pære" => "02", ... "banan" => "05");
>
Hvorfor ikke anvende sprogets egne faciliteter?
http://dk.php.net/manual/en/function.array-flip.php

--
Hilsen/Regards
Michael Rasmussen
http://pgp.mit.edu:11371/pks/lookup?op=get&search=0xE3E80917
A computer is like air conditioning: it becomes useless when you open
windows.


Bertel Lund Hansen (05-10-2010)
Kommentar
Fra : Bertel Lund Hansen


Dato : 05-10-10 08:41

Michael Rasmussen skrev:

> Hvorfor ikke anvende sprogets egne faciliteter?

God idé:

   http://dk.php.net/manual/en/function.array-search.php

Dit konkrete forslag var derimod ikke godt.

--
Bertel
http://bertel.lundhansen.dk/         FIDUSO: http://fiduso.dk/

Bertel Lund Hansen (05-10-2010)
Kommentar
Fra : Bertel Lund Hansen


Dato : 05-10-10 08:42

Kim Ludvigsen skrev:

> Jeg vil gerne have en omvendt funktion af et array.

Den findes allerede:

   http://dk.php.net/manual/en/function.array-search.php

--
Bertel
http://bertel.lundhansen.dk/         FIDUSO: http://fiduso.dk/

Kim Ludvigsen (05-10-2010)
Kommentar
Fra : Kim Ludvigsen


Dato : 05-10-10 17:51

, Bertel Lund Hansen skrev::
> Kim Ludvigsen skrev:
>
>> Jeg vil gerne have en omvendt funktion af et array.
>
> Den findes allerede:
>
>    http://dk.php.net/manual/en/function.array-search.php

Tak, men den adskiller sig ikke meget fra den, jeg selv
fandt, så den holder jeg fast i. Jeg har ikke brug for de
avancerede søgemuligheder i array_search.

--
Mvh. Kim Ludvigsen
Standardoverholdende multimedia på hjemmesiden:
http://kimludvigsen.dk/tips-internet-websnedker-multimedia.php


Bertel Lund Hansen (05-10-2010)
Kommentar
Fra : Bertel Lund Hansen


Dato : 05-10-10 18:53

Kim Ludvigsen skrev:

> >    http://dk.php.net/manual/en/function.array-search.php

> Tak, men den adskiller sig ikke meget fra den, jeg selv
> fandt, så den holder jeg fast i. Jeg har ikke brug for de
> avancerede søgemuligheder i array_search.

Okay, men så fik du ikke forklaret ordentligt hvad du skulle
bruge. Jeg gik ud fra at du havde et array og brugte det som et
normalt array og så bare af og til skulle lave et omvendt opslag.

Det du har lavet er et almindeligt associativt array hvor numrene
er værdierne, og ordene er nøgler - altså ikke en omvendt
funktion men en slags omvendt array..

--
Bertel
http://bertel.lundhansen.dk/         FIDUSO: http://fiduso.dk/

Kim Ludvigsen (05-10-2010)
Kommentar
Fra : Kim Ludvigsen


Dato : 05-10-10 19:45

, Bertel Lund Hansen skrev::

> Okay, men så fik du ikke forklaret ordentligt hvad du skulle
> bruge. Jeg gik ud fra at du havde et array og brugte det som et
> normalt array og så bare af og til skulle lave et omvendt opslag.

Det er reelt også tilfældet. Men det er ikke et problem at
lave et ekstra array til de få gange, hvor jeg skal lave det
omvendte opslag.

--
Mvh. Kim Ludvigsen
Ryd op i dine bogmærker/foretrukne med det gratis program
AM-Deadlink:
http://kimludvigsen.dk/programmer-tools-amdeadlink.php

Bertel Lund Hansen (05-10-2010)
Kommentar
Fra : Bertel Lund Hansen


Dato : 05-10-10 20:14

Kim Ludvigsen skrev:

> Det er reelt også tilfældet. Men det er ikke et problem at
> lave et ekstra array til de få gange, hvor jeg skal lave det
> omvendte opslag.

Det er ikke god skik at have flere udgaver af de samme data. Det
er en mulig kilde til fejl.

Og jeg forstår ikke hvorfor du kalder array_search() for
avanceret. Når du skal bruge værdien af post nummer 5, skriver du
bare:

   $value5=array_search (5, $Kims_array);

--
Bertel
http://bertel.lundhansen.dk/         FIDUSO: http://fiduso.dk/

Kim Ludvigsen (06-10-2010)
Kommentar
Fra : Kim Ludvigsen


Dato : 06-10-10 07:57

, Bertel Lund Hansen skrev::
> Kim Ludvigsen skrev:
>
>> Det er reelt også tilfældet. Men det er ikke et problem at
>> lave et ekstra array til de få gange, hvor jeg skal lave det
>> omvendte opslag.
>
> Det er ikke god skik at have flere udgaver af de samme data. Det
> er en mulig kilde til fejl.

Det er arrays til to forskellige ting, så jeg risikerer ikke
at få dem blandet sammen. Det ene er et tjek af en parameter
i URI, det andet skal bruges til databaseopslag.

> Og jeg forstår ikke hvorfor du kalder array_search() for
> avanceret. Når du skal bruge værdien af post nummer 5, skriver du
> bare:
>
>    $value5=array_search (5, $Kims_array);

Ok, jeg skulle måske have skrevet: "avanceret for mig".

Desuden har den anden metode et par fordele, som jeg ikke
umiddelbart var opmærksom på i mit tilfælde. Jeg undgår
værdien "0" for første post i arrayet, og jeg kan uden
besvær få et foranstillet "0" på resultatet, altså fx "01" i
stedet for "1".

--
Mvh. Kim Ludvigsen
Det nemmeste komma:
http://ordforklaring.dk/ordforklaring.php?forklaring=decimalkomma

Michael Rasmussen (05-10-2010)
Kommentar
Fra : Michael Rasmussen


Dato : 05-10-10 16:26

On Tue, 05 Oct 2010 09:41:16 +0200
Bertel Lund Hansen <splitteminebramsejl@lundhansen.dk> wrote:

>
> Dit konkrete forslag var derimod ikke godt.
>
Og hvorfor ikke om man må spørge?

Det forslag du kommer med, løser da ikke spørgerens problem!

--
Hilsen/Regards
Michael Rasmussen
http://pgp.mit.edu:11371/pks/lookup?op=get&search=0xE3E80917
A computer is like air conditioning: it becomes useless when you open
windows.


Michael Rasmussen (05-10-2010)
Kommentar
Fra : Michael Rasmussen


Dato : 05-10-10 16:28

On Tue, 5 Oct 2010 17:25:55 +0200
Michael Rasmussen <mir@miras.org> wrote:

Ups, der smuttede et ord.
> Det forslag du kommer med, løser da ikke spørgerens problem!
>
Der skulle have stået: "[..]løser da ikke spørgerens problem bedre!"

--
Hilsen/Regards
Michael Rasmussen
http://pgp.mit.edu:11371/pks/lookup?op=get&search=0xE3E80917
A computer is like air conditioning: it becomes useless when you open
windows.


Bertel Lund Hansen (05-10-2010)
Kommentar
Fra : Bertel Lund Hansen


Dato : 05-10-10 17:09

Michael Rasmussen skrev:

> > Det forslag du kommer med, løser da ikke spørgerens problem!
> Der skulle have stået: "[..]løser da ikke spørgerens problem bedre!"

Fordi dit forslag kræver at hele arrayet bearbejdes og et nyt
oprettes. Mit forslag kræver kun søgning i et eksisterende array.

--
Bertel
http://bertel.lundhansen.dk/         FIDUSO: http://fiduso.dk/

Michael Rasmussen (05-10-2010)
Kommentar
Fra : Michael Rasmussen


Dato : 05-10-10 17:51

On Tue, 05 Oct 2010 18:08:38 +0200
Bertel Lund Hansen <splitteminebramsejl@lundhansen.dk> wrote:

>
> Fordi dit forslag kræver at hele arrayet bearbejdes og et nyt
> oprettes. Mit forslag kræver kun søgning i et eksisterende array.
>
Nu kræver bearbejdningen ikke andet end blot swap af pointere, så hvis
der skal udskrives et helt array, er min løsningen mindre kostbar end
din.

Min løsning har en kompleksitet på O(n), mens din har kompleksiteten
O(n²).

--
Hilsen/Regards
Michael Rasmussen
http://pgp.mit.edu:11371/pks/lookup?op=get&search=0xE3E80917
A computer is like air conditioning: it becomes useless when you open
windows.


Bertel Lund Hansen (05-10-2010)
Kommentar
Fra : Bertel Lund Hansen


Dato : 05-10-10 18:50

Michael Rasmussen skrev:

> > Fordi dit forslag kræver at hele arrayet bearbejdes og et nyt
> > oprettes. Mit forslag kræver kun søgning i et eksisterende array.

> Nu kræver bearbejdningen ikke andet end blot swap af pointere, så hvis
> der skal udskrives et helt array, er min løsningen mindre kostbar end
> din.

> Min løsning har en kompleksitet på O(n), mens din har kompleksiteten
> O(n²).

Du må gerne forklare hvorfor en søgning har kompleksiteten O(n²).
En slavisk gennempløjning har så vidt jeg kan se kompleksiteten
O(n).

Og hvordan undgår du en søgning med din metode når Kim skal slå
et nummer op ud fra værdien?

--
Bertel
http://bertel.lundhansen.dk/         FIDUSO: http://fiduso.dk/

Martin (05-10-2010)
Kommentar
Fra : Martin


Dato : 05-10-10 20:14

On 05-10-2010 19:49, Bertel Lund Hansen wrote:
> Michael Rasmussen skrev:
>
>>> Fordi dit forslag kræver at hele arrayet bearbejdes og et nyt
>>> oprettes. Mit forslag kræver kun søgning i et eksisterende array.
>
>> Nu kræver bearbejdningen ikke andet end blot swap af pointere, så hvis
>> der skal udskrives et helt array, er min løsningen mindre kostbar end
>> din.
>
>> Min løsning har en kompleksitet på O(n), mens din har kompleksiteten
>> O(n²).
>
> Du må gerne forklare hvorfor en søgning har kompleksiteten O(n²).
> En slavisk gennempløjning har så vidt jeg kan se kompleksiteten
> O(n).
>
> Og hvordan undgår du en søgning med din metode når Kim skal slå
> et nummer op ud fra værdien?

array_search
Result: 4881
0.0003509521484375

in_array
Result: 1
0.00036311149597168

array_flip
Result: 4881
0.0037498474121094


<?php
$arraylength = 10000;

function randomchar($max) {
   $abc= array("a","b","c","d","e","f","g","h","i","j","k", "l", "m", "n",
"o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z");
   $str = '';
   $i=0;
   while($i < $max) {
      $str .= $abc[rand(0,count($abc))];
      $i++;
   }
   return $str;
}


// Lad os starte med at lave vores array
$array = array();
for($i=0;$i<$arraylength;$i++)
{
   $array[] = randomchar(10);
}

// Lad os lige gøre det hele unikt
$array = array_unique($array);

// Lad os tage en random key og value ud som vi skal lege med
$key = array_rand($array);
$value = $array[$key];

// Så ryster vi posen et par gange
shuffle($array);
shuffle($array);
shuffle($array);
shuffle($array);
shuffle($array);

// Lad os time array_search
echo '<h3>array_search</h3>';
$start = microtime(true);
echo '<p>Result: ' . array_search($value, $array) . '</p>';
$endtime = microtime(true)-$start;
echo '<h5>' . $endtime . '</h5>';

// Lad os time in_array
echo '<h3>in_array</h3>';
$start = microtime(true);
echo '<p>Result: ' . in_array($value, $array) . '</p>';
$endtime = microtime(true)-$start;
echo '<h5>' . $endtime . '</h5>';

// Lad os time array_search
echo '<h3>array_flip</h3>';
$start = microtime(true);
$array = array_flip($array);
echo '<p>Result: ' . $array[$value] . '</p>';
$endtime = microtime(true)-$start;
echo '<h5>' . $endtime . '</h5>';

Bertel Lund Hansen (05-10-2010)
Kommentar
Fra : Bertel Lund Hansen


Dato : 05-10-10 20:32

Martin skrev:

> array_search
> Result: 4881
> 0.0003509521484375

> array_flip
> Result: 4881
> 0.0037498474121094

Jeg er ikke overrasket. Er du?

--
Bertel
http://bertel.lundhansen.dk/         FIDUSO: http://fiduso.dk/

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408914
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste