Toon posts:

[PHP] Array aantal dimensies tellen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik wil het aantal dimensies van een multidimensionele array tellen... Google gezocht, PHP.net gezocht, volgende voorbeeldfunctie gevonden:

PHP:
1
2
3
4
5
6
7
8
9
10
11
function countdim($array)
{
    static $dimcount = 1;
    if (is_array(reset($array))) {
        $dimcount++;
        $return = countdim(reset($array));
    } else {
        $return = $dimcount;
    }
    return $return;
}

Leuke functie enzo, nu zit ik met het volgende probleem:

Doe ik bijv. het volgende:

PHP:
1
2
3
4
5
6
7
8
9
10
11
$arr1 = array("11", 1212 , 3194);

$arr2 = array("what" => false,
              "Test" => array(31,143,142),
              "Nogwat" => array(325432, 123, 12398));

var_dump($arr1);
var_dump(countdim($arr1));

var_dump($arr2);
var_dump(countdim($arr2));

Tot mijn grote spijt geeft $arr2 ook een dimensie van 1 terug... Dat komt doordat het eerste element false is en dus geen array.

Ik wil dus dat het aantal dimensies afhankelijk is van minstens 1 geneste array, en dus elementen die geen array zijn genegeerd worden. TENZIJ de array geen arrays bevat natuurlijk.

Alvast bedankt!

Acties:
  • 0 Henk 'm!

  • Macros
  • Registratie: Februari 2000
  • Laatst online: 15-05 16:29

Macros

I'm watching...

Nu test je alleen of het eerste element een array is. Dus je algoritme gaat van een homogene array uit. Nu zul je dus dat moeten veranderen zodat hij alle elementen test.

"Beauty is the ultimate defence against complexity." David Gelernter


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dat snap ik, maar hoe! Ik hoef geen precieze code, maar wat hints zouden fijn zijn!

Acties:
  • 0 Henk 'm!

  • Macros
  • Registratie: Februari 2000
  • Laatst online: 15-05 16:29

Macros

I'm watching...

Door een for loopje te schrijven die alle elementen test en van de maximale resultaat van alle tests terug geeft.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
function countdim($array) 
{ 
    if (is_array($array)) { 
        $max = 1;
        for($array as $element){
              $cur = countdim($element);
              $max = ($cur > $max) ? $cur : $max;
        }
        return $max + 1;
    } else { 
        return 1; 
    } 
}


Zoiets lijkt me te werken. Niet getest.

"Beauty is the ultimate defence against complexity." David Gelernter


Acties:
  • 0 Henk 'm!

  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 09-09 15:24
Wat je zult moeten doen is alle elementen van het array recursief doorlopen om te testen of het een array is. Dat kan m.b.v. de functie is_array (open deur ;) ) Daarbij zul je de 'diepte' steeds een moeten ophogen, bij elke stap die je dieper gaat en daarbij voor elke 'tak' die je 'inslaat' (als je een multidimensionaal array bekijk als een boomstructuur) controleren of je niet al dieper bent geweest.

Hieronder een poging (niet getest!) maar het laat het idee zien.

edit:

Code is niet correct zie edit hieronder!
Maar ik laat hem zo staan om het probleem te illustreren >:)


PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$multidim=array(1,2,3); // maar dan een multidimensionaal array

function checkElement($item,$depth=0){
    if(is_array($item)){
        $depth++;
        foreach($item as $sub){
            $rv=checkElement($sub,$depth);
            if($rv>$depth){
                $depth=$rv;
            }
        }
    }
    return($depth);
}

echo checkElement($multidim); // geeft de maximale diepte van het array


edit:

Macros heeft dus idd ongeveer het zelfde... En die code klopt beter...
Ik heb toch nog een fout gemaakt bij dat waar ik zelf van zei dat je erop moest letten... |:(

[ Voor 21% gewijzigd door beetle71 op 04-08-2004 17:24 ]