array vraag

Overzicht Reageren

Ozzie PHP

Ozzie PHP

05/03/2013 17:42:58
Quote Anchor link
Hallo,

Ik heb een functie waar ik keys wil ingeven en waarbij ik op basis van die keys key/value paren wil terugkrijgen. Een voorbeeldje

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
function get(array $keys_to_check) {
    $data = array('beest' => 'kip', 'voertuig' => 'auto', 'eten' => 'pizza');
    return array_intersect_key(array_flip($keys_to_check), $data);
}


$test = get(array('beest', 'eten'));
var_dump($test);
?>


Hier komt een array uit met deze inhoud:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
[beest] => 0
[eten] => 1


Echter, ik wil dat er dit uitkomt:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
[beest] => 'kip'
[eten] => 'pizza'


Hoe doe ik dat het handigst?
 
PHP hulp

PHP hulp

21/10/2014 12:16:20
 
Erwin H

Erwin H

05/03/2013 17:48:25
Quote Anchor link
Of het 'handigst' is weet ik niet, maar bijvoorbeeld:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
$ret
= array();
foreach( $keys_to_check as $key ){
  if ( isset( $data[$key] ){
    $ret[$key] = $data[$key];
  }
}


return $ret;
?>
 
TJVB tvb

TJVB tvb

05/03/2013 17:59:37
Quote Anchor link
Volgens mij moet je de parameters omdraaien dus:
return array_intersect_key( $data , array_flip($keys_to_check) );
 
Ozzie PHP

Ozzie PHP

05/03/2013 18:49:37
Quote Anchor link
Bedankt voor jullie reacties. De oplossing van TJVB werkt prima!!!

(@Erwin: ik probeer uit performance oogpunt altijd om foreach loops te voorkomen voor dit soort functies.)
 
Wouter J
Moderator

Wouter J

05/03/2013 18:52:57
Quote Anchor link
Offtopic:
(merk op dat deze functies binnenin ook gewoon (meerdere) for(each) loops gebruiken)
 
Ozzie PHP

Ozzie PHP

05/03/2013 18:54:11
Quote Anchor link
Wouter J op 05/03/2013 18:52:57:
Offtopic:
(merk op dat deze functies binnenin ook gewoon (meerdere) for(each) loops gebruiken)

Verpest het nou niet voor me! ;)

Toch heb ik het idee, dat dit nog wel altijd sneller gaat dan zelf een foreach uitschrijven.
 
Erwin H

Erwin H

05/03/2013 18:56:32
Quote Anchor link
Door een array lopen zonder een loop is onmogelijk, dus die foreach loop vermijden heeft alleen nu als je het door jezelf geschreven regels code wilt verkleinen.

En in dit geval, array_intersect_key en array_flip moet door een array wandelen. Ik vraag me af wat je nu dus probeert te voorkomen....

PS. mijn ervaring is dat over het algemeen de php array functies behoorlijk traag zijn, dus die continu gebruiken is zeker geen garantie voor een betere performance.
Gewijzigd op 05/03/2013 18:57:33 door Erwin H
 
Ozzie PHP

Ozzie PHP

05/03/2013 19:03:03
Quote Anchor link
Ah oke... ik dacht dat dit de snelste oplossing. Volgens mij is het wel sneller dan een handmatige loop, maar dat zou ik moeten benchmarken.

Toevoeging op 05/03/2013 19:08:35:

Snel even benchmark gedaan. De niet-foreach variant is ietsje sneller. Het verschil wordt duidelijker naarmate de array uitgebreider wordt.
 



Overzicht Reageren