[php] array_splice_recursive?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Rekcor
  • Registratie: Februari 2005
  • Laatst online: 05-09 21:08
Ik heb een multidimensionale array:

PHP:
1
2
3
4
5
6
7
$aMenu = array("Node1"=>array ("c",
                           "d",
                           "e"),
               "Node2"=>array ("f",
                           "Node3"=>array("h",
                                      "i", 
                                      "j")));


Nu probeer ik al een hele tijd een functie te maken, die deze array recursief doorloopt en waarden verwijderd. De te verwijderen waarden moeten aangeleverd kunnen worden in een array. Dus zoiets als:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
$aItemsToDelete=array('d', 'f' 'j');

print_r(array_splice_recursive($aItemsToDelete, $aArray))

/* geeft:

$aMenu = array("Node1"=>array ("c",
                           "e"),
               "Node2"=>array ("Node3"=>array("h",
                                      "i")));

*/


Onderstaande functie heb ik:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function array_splice_recursive($aItemsToDelete, $aArray)
{
  foreach($aArray as $key=>$value)
  {
    if (is_array($value))
    {
      $aArray[$key] = array_splice_recursive($aItemsToDelete, $value);
    }
    else
    {      
      if (array_search($value, $aItemsToDelete)!='')
      {
        array_splice($aArray, $key, 1);
      }
    }
  }
  
  return $aArray;
}


Een mooie functie (al zeg ik het zelf), met maar een nadeel: hij werkt niet :(. De array die hij uitspuugt is namelijk wel kleiner dan het origineel, maar wat er precies is gebeurd, is onvoorspelbaar.

Wie wordt mijn vriend vandaag?

[ Voor 4% gewijzigd door Rekcor op 16-03-2007 10:20 . Reden: De uitgespuugde array was niet leeg, maar gaf rare waarden. ]


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Op regel 13 van je functie voer je array_splice uit, maar doe je niks met wat die functie teruggeeft.

Acties:
  • 0 Henk 'm!

  • Rekcor
  • Registratie: Februari 2005
  • Laatst online: 05-09 21:08
GlowMouse schreef op vrijdag 16 maart 2007 @ 10:15:
Op regel 13 van je functie voer je array_splice uit, maar doe je niks met wat die functie teruggeeft.
Klopt, ik ben ook niet geinteresseerd in het uitgeknipte deel, maar in de overblijvende array ;)

Acties:
  • 0 Henk 'm!

Verwijderd

Volgens mij ben je daar wel in geinteresseerd, daarmee kan je namelijk volgen wat er precies uitgeknipt wordt ;)

Acties:
  • 0 Henk 'm!

  • Rekcor
  • Registratie: Februari 2005
  • Laatst online: 05-09 21:08
Verwijderd schreef op vrijdag 16 maart 2007 @ 10:30:
Volgens mij ben je daar wel in geinteresseerd, daarmee kan je namelijk volgen wat er precies uitgeknipt wordt ;)
Maar dit hoef ik toch niet te volgen? Ik wil weten wat er overblijft, niet wat eruitgeknipt wordt.

Volgens mij gaat het wel fout bij

PHP:
1
2
3
4
if (array_search($value, $aItemsToDelete)!='')
{
  array_splice($aArray, $key, 1);
}


omdat foreach dan niet meer klopt (de array is immers kleiner geworden...) :?

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Sorry dat ging toch goed. Ik dacht dat er juist de nieuwe array teruggegeven zou worden omdat ik niet zag dat er een pointer doorgegeven werd.

De juiste fout heb ik nu wel gevonden. array_search vergelijk je met ''. In PHP geldt dat false ook gelijk is aan ''. Je moet dus ook op type (boolean) controleren. Vervang !='' eens door !== false, en het zal werken :)

Acties:
  • 0 Henk 'm!

Verwijderd

het is keurig functie alleen jammer dat je zoals GlowMouse al zegt niet voor de echte false maar voor alles wat in false evalueert checked.

daarnaast kan een print of print_r ook geen kwaad als je wilt weten wat er gebeurt. check de manual nog eens op www.php.net zou ik zeggen en dan vooral de array_splice en boolean type pages.

edit: deze pagina's dus,
http://www.php.net/manual/en/function.array-splice.php
http://www.php.net/manual....operators.comparison.php

ik moet toegeven dat het er niet explicit bijstaat maar als de array-splice successvol is dan geeft deze dus een array terug. of deze dan ook false terug geeft of een lege array indien niet successvol staat er niet bij maar dat kun je makkelijk uitproberen met een var_dumpje er tussen.

[ Voor 39% gewijzigd door Verwijderd op 16-03-2007 15:27 ]


Acties:
  • 0 Henk 'm!

  • Rekcor
  • Registratie: Februari 2005
  • Laatst online: 05-09 21:08
Mmm... met !== doet hij het ook niet naar behoren :'(

Heb nu alleen geen tijd om er aan te werken. Maandag is er weer een dag!

Bedankt iig voor de hulp!

Acties:
  • 0 Henk 'm!

  • WormLord
  • Registratie: September 2003
  • Laatst online: 21-09 10:10

WormLord

Devver

Je moet ook geen array_splice gebruiken, maar unset. Array_splice werkt namelijk met een offset i.p.v. array keys.
En om te kijken of een waarde in een array voorkomt gebruik je natuurlijk in_array ;)

Hier is een werkende versie.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
function array_splice_recursive($aItemsToDelete, $aArray)
{
  foreach($aArray as $key=>$value)
  {
    if (is_array($value))
    {
      $aArray[$key] = array_splice_recursive($aItemsToDelete, $value);
    }
    else
    {
      if (in_array($value, $aItemsToDelete))
      {
        unset($aArray[$key]);
      }
    }
  }

  return $aArray;
}
?>

Acties:
  • 0 Henk 'm!

  • Rekcor
  • Registratie: Februari 2005
  • Laatst online: 05-09 21:08
@WormLord: bedankt, deze functie werkt prima (alleen blijven de keys bestaan, de reden waarom ik geen unset gebruikte, maar daar heb ik al een workaround voor gemaakt in de code die deze functie aanriep).

@de rest: ook bedankt voor de hulp!
Pagina: 1