|
| 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 |
| | |
Bertel Lund Hansen (05-10-2010)
| Kommentar Fra : Bertel Lund Hansen |
Dato : 05-10-10 08:41 |
| | |
Bertel Lund Hansen (05-10-2010)
| Kommentar Fra : Bertel Lund Hansen |
Dato : 05-10-10 08:42 |
| | |
Kim Ludvigsen (05-10-2010)
| Kommentar Fra : Kim Ludvigsen |
Dato : 05-10-10 17:51 |
| | |
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 |
| | |
|
|