Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[PHP] array elementen opbouwen by reference

Pagina: 1
Acties:

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
nevermind, tijdens het typen bedacht ik me dat een recursieve functie toch netter is...
dus onderstaande is niet meer interessant...
zal zo mijn recursieve oplossing plaatsen..

-------
er moet een string worden omgezet naar een array. Dit heb ik voor elkaar. Mijn vraag is echter of dit wel de juiste manier is of dat ik op deze manier misschien geheugen-alloceer problemen of iets dergelijks krijg?

ik heb een string:

code:
1
level1.level2.level3.level4 = 5


het aantal levels is van tevoren onbekend.

nu wil ik dit omzetten naar een array:

PHP:
1
$result["level1"]["level2"]["level3"]["level4"] = 5;


mijn oplossing is zoals hieronder, by reference:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$result = array();
$subresult = &$result;

$loop = explode(".", $leftofstring);
for ($i = 0; $i < count($loop); ++$i) {
   if ($i == count($loop) -1) {
      // laatste element
      $subresult[$loop[$i]] = $value;
   } else {
      if (!array_key_exists($loop[$i], $subresult)) {
         $subresult[$loop[$i]] = array();
      }
      $subresult = &$subresult[$loop[$i]];
   }
}

return $result;


Mijn vraag is dus of ik nu niet geheugen lokaties overschrijf die "random" problemen gaan geven.

ik vond trouwens ook de volgende oplossing... een stuk korter maar die maakt gebruik van eval, en die spreekt onbekende array_keys direct aan en dat heeft niet echt mijn voorkeur:
code:
1
2
$code = "\$result[" . join("][", $loop) . "] = \$value";
eval($code);


wat is best practice? mijn huidige oplossing? de eval-functie? of zal ik maar een recursieve functie schrijven?

[ Voor 9% gewijzigd door P.O. Box op 19-10-2012 16:26 ]


  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
ik ben dus toch voor de recursieve oplossing gegaan:

code:
1
2
3
4
5
6
7
8
9
10
        function BuidMultidimensionalArray($array_onedimensional, $value = "") {
            $result = array();
            if (count($array_onedimensional) == 0) {
                return $value;
            } else {
                $key = array_shift($array_onedimensional);
                $result[$key] = BuidMultidimensionalArray($array_onedimensional, $value);
            }
            return $result;
        }

  • pedorus
  • Registratie: Januari 2008
  • Niet online
In principe is juist de niet-recursieve oplossing mooier lijkt mij.
pedorus in "\[PHP/MySQL] SQL injectie voorkomen"

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten