Portal > Foren > PHP > PHP-Programmierung > Anzahl Elemente in multidimensionalem Array ermitteln
Antwort
 
Themen-Optionen Thema durchsuchen
Alt 15.02.2007, 12:20 Nach oben    #1
leftover when bar closes
 
Benutzerbild von dsxs
 
Registriert seit: 29.06.2006
Ort: Bern
Beiträge: 123
Standard Anzahl Elemente in multidimensionalem Array ermitteln

Hi Leute

Ich habe ein Array, welches viele weitere Arrays enthält. Jedes dieser Arrays enthält wiederum viele Arrays und irgendwann komme ich dann zu der Dimension, in welcher nur noch Einträge sind.

Die Anzahl dieser Einträge im gesamten, grossen Array möchte ich nun auszählen.

Ich bin sicher, dass dies mit einer Callback Funktion möglich sein muss, bringe es mit array_map einfach nicht hin.

Hat mir jemand eine einfache Lösung?

Danke im Voraus
__________________
Unkraut ist die Opposition der Natur gegen die Regierung der Gärtner.
ticketbörse

dsxs ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.02.2007, 12:31 Nach oben    #2
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.516
Standard

Hm,
ohne mir jetzt wirklich Gedanken gemacht zu haben, würde ich das rekursiv so lösen, dass ich in das Array "reingehe" und es durchlaufe und immer, wenn ein Element ein Array ist, gehe ich eine Dimension tiefer. Muss man dann den aktuellen Schlüssel mitgeben, um beim Rücksprung wieder an der richtigen Stelle weitermachen zu können.

Hmmm ..
Ben ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.02.2007, 12:35 Nach oben    #3
Corvin Gröning
 
Benutzerbild von Corvin
 
Registriert seit: 19.03.2005
Ort: S-H | Flensburg
Beiträge: 459
Standard

Zitat:
Zitat von http://de.php.net/manual/en/function.count.php
If the optional mode parameter is set to COUNT_RECURSIVE (or 1), count() will recursively count the array. This is particularly useful for counting all the elements of a multidimensional array. The default value for mode is 0. count() does not detect infinite recursion.
Also:
PHP-Code:
echo count($arr1); 

// edit:
Mouhaha. Just RTFM!
__________________

Geändert von Corvin (15.02.2007 um 12:48 Uhr)
Corvin ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.02.2007, 12:36 Nach oben    #4
Martin Breuer
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.653
Standard

PHP-Code:
function countArray($arr) {
  foreach(
$arr as $key => $value) {
    if (
is_array($value) {
      
countArray($arr);
    } else {
      
$i++;
    }
  }
}

$i 0;
countArray($deinArray);
echo 
"Größe: ".$i
sollte doch reichen oder?

PS: für fehler übernehm ich keine Haftung, hab momentan nur noch in Java zu tun

//nachtrag:
tjo das nennt man wohl owned
__________________
I did it my way - Senseless-Blog
Weihnachtsgeschenk? Schülern helfen - Bodypainting Kalender für 2009
WarrenFaith ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.02.2007, 12:41 Nach oben    #5
leftover when bar closes
 
Benutzerbild von dsxs
 
Registriert seit: 29.06.2006
Ort: Bern
Beiträge: 123
Standard

Danke für eure raschen Antworten.

@Ben und Warren: so habe ich mir das eben auch gedacht, aber ich war mir sicher, dass es auch einfacher geht als dutzende von foreach Schlaufen zu generieren.

Super Corvin, den kannte ich nicht. Owned, jep *rofl*

Danke an alle
__________________
Unkraut ist die Opposition der Natur gegen die Regierung der Gärtner.
ticketbörse

dsxs ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.02.2007, 12:42 Nach oben    #6
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.516
Standard

Oh fein. Das kannte ich auch nicht.
Definitiv einfacher, als da selbst rumzu"rekursieren"
Ben ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.02.2007, 13:04 Nach oben    #7
Dejan Spasic
 
Benutzerbild von dejan_spasic
 
Registriert seit: 05.01.2006
Ort: Düsseldorf
Beiträge: 169
Standard

Zitat:
Zitat von Corvin Beitrag anzeigen
Zitat:
Zitat von http://de.php.net/manual/en/function.count.php
If the optional mode parameter is set to COUNT_RECURSIVE (or 1), count() will recursively count the array. This is particularly useful for counting all the elements of a multidimensional array. The default value for mode is 0. count() does not detect infinite recursion.
Also:
PHP-Code:
echo count($arr1); 
Dazu sage ich nur
Zitat:
Wenn ich eine Oper hundertmal dirigiert habe, dann ist es Zeit, sie wieder zu lernen.– Arturo Toscanini (1867–1957)


Nur, die Funkition gibt be einem Array wie diesem hier
PHP-Code:
$arr = array(
    array(
        array(
'eins''zwei'),
        array(
'drei''vier'),
    ),
    array(
        array(
            array(
'fünf''sechs')
        ),
        array(
'sieben''acht''neun'),
        array(
            array(
                array(
'zehn')
            ),
        ),
    ),
    
'elf'   
); 
21 zurück. Was auch eigentlich richtig ist, da es auch die "Knotenpunkte"
bei Zählung mit einbezieht. Doch wie ich dsxs verstanden habe, benötigt er
eine Funktion die 11 zurück gibt. Wenn es so sein sollte, dann ist der
Lösungsweg von WarrenFaith der richtige.
__________________
Da wir alle in einem Boot sitzen, ist es gut, dass wir nicht alle auf einer Seite stehen... (mir unbekannt)
dejan_spasic ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.02.2007, 13:14 Nach oben    #8
leftover when bar closes
 
Benutzerbild von dsxs
 
Registriert seit: 29.06.2006
Ort: Bern
Beiträge: 123
Standard

Danke noch für den Input Dejan... Habe dies auch soeben bemerkt -> count zusammen mit dem Flag, den Corvin vorschlug, zählt mir auch die Arrays selber, welche ich eigentlich nicht dabei haben wollte...

Dementsprechend habe ich jetzt Warrens Idee eingebaut.
__________________
Unkraut ist die Opposition der Natur gegen die Regierung der Gärtner.
ticketbörse

dsxs ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.02.2007, 13:32 Nach oben    #9
Martin Breuer
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.653
Standard

Yeah doch nicht geowned
__________________
I did it my way - Senseless-Blog
Weihnachtsgeschenk? Schülern helfen - Bodypainting Kalender für 2009
WarrenFaith ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.02.2007, 14:41 Nach oben    #10
Waq
Erfahrener Benutzer
 
Registriert seit: 18.08.2005
Beiträge: 108
Standard

PHP-Code:
function countRecursive ($x) {
    if (
is_array($x))
        return 
array_sum(array_map('countRecursive',$x));
    else 
        return 
1;

funktionale Programmierung ownz
Auch wenn das in einer funktionalen Sprache besser lesbar wäre, und deklarativ ein Zweizeiler ohne If-Gerücke.

Geändert von Waq (15.02.2007 um 14:49 Uhr) Grund: Ergänzung
Waq ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.02.2007, 15:03 Nach oben    #11
Martin Breuer
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.653
Standard

doch geowned - wie fies! :-P
__________________
I did it my way - Senseless-Blog
Weihnachtsgeschenk? Schülern helfen - Bodypainting Kalender für 2009
WarrenFaith ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.02.2007, 16:57 Nach oben    #12
Dejan Spasic
 
Benutzerbild von dejan_spasic
 
Registriert seit: 05.01.2006
Ort: Düsseldorf
Beiträge: 169
Standard

Zitat:
Zitat von Waq Beitrag anzeigen
PHP-Code:
function countRecursive ($x) {
    if (
is_array($x))
        return 
array_sum(array_map('countRecursive',$x));
    else 
        return 
1;

funktionale Programmierung ownz
Auch wenn das in einer funktionalen Sprache besser lesbar wäre, und deklarativ ein Zweizeiler ohne If-Gerücke.
Nice

Doch die rekursive Variante von WarrenFaith ist von der Perfomence um einiges besser und zwar im Durchschnitt um 45-50%.

PHP-Code:
$arr = array(
    array(
        array(
'eins''zwei'),
        array(
'drei''vier'),
    ),
    array(
        array(
            array(
'fünf''sechs')
        ),
        array(
'sieben''acht''neun'),
        array(
            array(
                array(
'zehn')
            ),
        ),
    ),
    
'elf',
);

function 
countRecursive ($x
{
    if (
is_array($x))
        return 
array_sum(array_map('countRecursive',$x));
    else 
        return 
1;
}

function 
count_deep_values(array $a)
{
    
$c 0;
    foreach (
$a as $v) {
        if (
is_array($v)) 
            
$c += count_deep_values($v);
        else  
            ++
$c;
    }
    return 
$c;
}

require_once 
'Benchmark/Iterate.php';

$benchmark = new Benchmark_Iterate();

$benchmark->run(1000'countRecursive'$arr);
$result $benchmark->get();
$first $result['mean'];

$benchmark = new Benchmark_Iterate();

$benchmark->run(1000'count_deep_values'$arr);
$result $benchmark->get();
$second $result['mean'];

print 
"countRecursive: " $first PHP_EOL//~0.000118
print "count_deep_values: " $second PHP_EOL//~0.00079 
__________________
Da wir alle in einem Boot sitzen, ist es gut, dass wir nicht alle auf einer Seite stehen... (mir unbekannt)

Geändert von dejan_spasic (15.02.2007 um 17:06 Uhr)
dejan_spasic ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 15.02.2007, 17:26 Nach oben    #13
Erfahrener Benutzer
 
Benutzerbild von JumperII
 
Registriert seit: 27.02.2006
Beiträge: 159
Standard

Wundert mich nicht wirklich, da die verschachtelten Prozeßaufrufe inkl. Callback-funktionalität mehr overhead in der Verwaltung bedeuten.

Gruß,
Jumper, the II.
JumperII ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 16.02.2007, 13:05 Nach oben    #14
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.516
Standard

Sehr interessanter Thread.
Die unterschiedlichen Methoden sind wirklich nett und der Benchmark von waq's Lösung rundet das eigentlich gut ab.

Zum Anschauen ist countRecursive() aber wirklich klasse.
Ben ist offline  
Diesen Beitrag zu to del.icio.us hinzufügen!Diesen Beitrag zu Technorati hinzufügen!Diesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
PingBacks sind an
RefBacks sind aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Zend Framework - Probleme mit Zend_Controller_RewriteRouter bzw. Form der URLs Ben PEAR, PECL und Frameworks 12 24.12.2006 17:17
Suche Hilfe: Angebot und Nachfrage berechnen ljungi Plauderecke 6 17.12.2006 22:10
Array in Bezug auf ein anderes sortieren... code5 PHP-Programmierung 2 15.05.2006 15:56
Ein Array in ein Array schreiben bacarni PHP-Programmierung 2 07.02.2006 14:24
Anzahl der Datensätze ermitteln ehli75 Datenbanken 3 25.05.2005 22:11


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:07 Uhr.


Powered by vBulletin® Version 3.7.4 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45