php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 28.01.2012, 03:45  
Neuer Benutzer
 
Registriert seit: 23.05.2010
Beiträge: 10
PHP-Kenntnisse:
Fortgeschritten
Nightmares befindet sich auf einem aufstrebenden Ast
Standard [Erledigt] Multidimensionales Array - Zugriff über die Werte eines anderen Arrays

Guten Morgen,
ich hab eine Mutlidimensionales Array (ab jetzt MDA) und möchte mit einem zweiten Array("Steuer Array", ab jetzt SA), genauer gesagt mit dessen Werte (in logischer Rheinfolge(0,1,2,...n), auf das erste Array zugreifen.

Also ca. so:
PHP-Code:
$mda[$sa[0]][$sa[1]][$sa[2]] ..... [$sa[n]] 
Ich habe das ganze bereits Iterativ und Rekursiv ohne Probleme umgesetzt... meine Frage ist: gibts das irgentwie schon als "native" Funktion? Hab sowas noch nicht gefunden.

Sieht so aus:
PHP-Code:
function searchArrayForPathIterative($mda$path) {
    
$pathIndex 0;
    
$tmp $mda;
    
    while(
$pathIndex count($path)) {
        if(empty(
$tmp[$path[$pathIndex]])) {
            return 
null;
        }
        
$tmp $tmp[$path[$pathIndex]];
        
$pathIndex++;
    }
    return 
$tmp;

Nachtrag: Es geht hierbei um Performanz, diese Funktion wird relativ häufig verwendet, deswegen ziehe ich hier erstmal die Iterative der Rekursiven (bzw. dem "bösen" eval() Konstrukt) vor. Falls es sowas noch nicht gibt werde ich das ganze selbst als Modul in C umsetzen (falls wer Interesse hat gebe ich dann auch den Quellcode dazu raus).

Geändert von Nightmares (28.01.2012 um 03:55 Uhr).
Nightmares ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 28.01.2012, 09:56  
Benutzer
 
Registriert seit: 18.12.2011
Beiträge: 37
PHP-Kenntnisse:
Fortgeschritten
K313 befindet sich auf einem aufstrebenden Ast
Standard

könntest du selbst erklären, was du bei jeder zeile damit willst?
K313 ist offline   Mit Zitat antworten
Alt 28.01.2012, 11:14  
archer42
Gast
 
Beiträge: n/a
Standard

foreach?
  Mit Zitat antworten
Alt 28.01.2012, 12:41  
meikel
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von Nightmares Beitrag anzeigen
PHP-Code:
    while($pathIndex count($path)) { 
Nachtrag: Es geht hierbei um Performanz, ...
count($path) gehört nicht in den Schleifenkopf, da sich an $path nix ändert.
  Mit Zitat antworten
Alt 28.01.2012, 13:19  
Erfahrener Benutzer
 
Registriert seit: 28.05.2008
Beiträge: 2.094
PHP-Kenntnisse:
Fortgeschritten
rudygotya ist einfach richtig nettrudygotya ist einfach richtig nettrudygotya ist einfach richtig nettrudygotya ist einfach richtig nettrudygotya ist einfach richtig nett
Standard

Warum nicht einfach einen Iterator verwenden? http://php.net/manual/de/class.iterator.php
__________________
++++ Wieder einer ins Netz gegangen: Phishers Fritz zufrieden ++++
Blog
rudygotya ist offline   Mit Zitat antworten
Alt 28.01.2012, 17:10  
Neuer Benutzer
 
Registriert seit: 23.05.2010
Beiträge: 10
PHP-Kenntnisse:
Fortgeschritten
Nightmares befindet sich auf einem aufstrebenden Ast
Standard

a) ja stimmt, das gehört nicht in den Schleifenkopf,

b) Code Update
PHP-Code:
function searchArrayForPathIterative($mda$path) {
    
$pathIndex 0;
    
$tmp $mda;
    
$pathSize count($path);
    
    while(
$pathIndex $pathSize) {
        if(empty(
$tmp[$path[$pathIndex]])) {
            return 
null;
        }
        
$tmp $tmp[$path[$pathIndex]];
        
$pathIndex++;
    }
    
    return 
$tmp;

c) was mich am Iterator stört: Objekt overhead

d) Orginal Frage: Gibts das bereits als native Methode in PHP (C ist halt schneller als PHP), ich brauch die Methode leider sehr oft und kann auch die Datenstruktur nicht ändern (schlechte API, habe ich leider die wahl nicht).

Die Iterative Variante is ja schonmal erheblich schneller als die Rekursive. Allerdings halt nicht das gelbe vom Ei. Das ganze mal in C umgesetzt ist bei den gleichen Testarrays einfach bedeutend schneller (wenn man nur den Pointer durch das Array bewegt und nicht immer eine Array Kopie (eines Ausschnittes) anlegen muss wie in der Zeile:
PHP-Code:
$tmp $tmp[$path[$pathIndex]]; 
Das gleiche gilt für den Iterator: Objekt Overhead...

Wirklich keiner eine Idee obs sowas schon gibt?

EDIT:
bzw in C: map<string,string> usw.

Geändert von Nightmares (28.01.2012 um 17:13 Uhr).
Nightmares ist offline   Mit Zitat antworten
Alt 28.01.2012, 18:18  
Benutzer
 
Registriert seit: 18.12.2011
Beiträge: 37
PHP-Kenntnisse:
Fortgeschritten
K313 befindet sich auf einem aufstrebenden Ast
Standard

ich verstehe nicht was du mit diese code ergreifen willst...
...
Du willst prüffen ob es im associativen array $mda sonst eine key-name gibt die von namen im array $path zur verfügung steht. Du beginst whilen und wenn sonst eine name von $path in $mda[key] nicht gibt dann returnst du sofort mit null raus. Aber wenn es gibt $mda[key-name von $path[n]] dann überschreibst du bei jedem treffer $tmp mit gleichem verzeichnis ($mda[key-name])... Willst du beim ersten treffer die suche nicht abbrechen und $tmp genießen? Oder willst du unbedingt ganze $path uberpruffen um sicher zu sein dass dort keine value gibt die im $mda als key-name nicht gibt? Wenn ja, dann bei erster fehlschlage bekommst du wieder nur ein NULL.............................................. ........
K313 ist offline   Mit Zitat antworten
Alt 28.01.2012, 18:26  
Erfahrener Benutzer
 
Benutzerbild von Arne Drews
 
Registriert seit: 22.04.2009
Beiträge: 3.486
PHP-Kenntnisse:
Anfänger
Arne Drews wird schon bald berühmt werdenArne Drews wird schon bald berühmt werden
Arne Drews eine Nachricht über Skype™ schicken
Standard

Also implementiert wird es das nicht geben in PHP.
Wenn ich Dein Vorhaben richtig verstanden habe, könnte man evtl. auf sowas aufbauen:
PHP-Code:
function getSALevelFromMDA$keys$src, &$result ) {
  
$result $src;

  if( 
count($keys)>) {
    
getSALevelFromMDAarray_values(array_slice($keys1)), $src[$keys[0]], $result );
  }
}

getSALevelFromMDA$sa$mda$result ); 
__________________
Phantasie ist wichtiger als Wissen, denn Wissen ist begrenzt.
Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.
Albert Einstein
Arne Drews ist offline   Mit Zitat antworten
Alt 28.01.2012, 19:49  
Neuer Benutzer
 
Registriert seit: 23.05.2010
Beiträge: 10
PHP-Kenntnisse:
Fortgeschritten
Nightmares befindet sich auf einem aufstrebenden Ast
Standard

Was du gemacht hast war einfach die rekursive Lösung. Das ist deutlich langsamer als Iterativ. Allerdings hast du mir eine Idee geben, mit der das ganze noch nen Tick schneller geht:
PHP-Code:
function searchArrayForPathIterative($mda$path) {
    
$pathIndex 0;
// tmp wird zum alias für $mda
    
$tmp = &$mda;
    
$pathSize count($path);
    
    while(
$pathIndex $pathSize) {
        if(empty(
$tmp[$path[$pathIndex]])) {
            return 
null;
        }
// $tmp wird zum alias von einem teil von $tmp
        
$tmp = &$tmp[$path[$pathIndex]];
        
$pathIndex++;
    }
    
    return 
$tmp;

Das ganze ist zwar kein "richtiger" Pointer, laut Test aber nochmal schneller und annehmbar. Ich glaube hierbei belassen wir es mal und ich makier das ganze als erledigt. Werde wohl doch irgentwan eine C Lösung Umsetzen müssen, aber die letzte Verbesserung hat nochmal ordentlich was gebracht.

Nachtrag:
@k133: Ich muss den ganzen Pfad durchlaufen (sonst wäre die ganze Aktion eh sinnlos, irgentwie muss ich am Ende ja auch an die Daten kommen oder?). Allerdings kann ich jeweils abbrechen, wenn in einer Ebene der Teil des Pfades nicht da ist.
Deswegen habe ich das ganze im 1. Post auch so beschrieben:
PHP-Code:
 $mda[$sa[0]][$sa[1]][$sa[2]] ..... [$sa[n]] 
Nachtrag2:
Natürlich könnte ich das ganze auch als richtig großer if-Baum Umsetzen bis zur zum Beispiel 10. Ebene und von da aus dann mit der Iterativen Funktion weiter machen:
PHP-Code:
$pathSize count($path)
if(
$pathSize == 1)
return 
$mda[$path[1]]
elseif(
$pathSize == 2)
return 
$mda[$path[1]][$path[2]]
elseif(
$pathSize == n)
return 
$mda[$path[1]][$path[2]]....$mda[$path[n]]
else
return 
iterativeMethode($source,$path

Geändert von Nightmares (28.01.2012 um 19:59 Uhr).
Nightmares ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

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 are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[Erledigt] PDF im Browser Streamen PiXeL1337 PHP Einsteiger 22 08.09.2011 16:24
[Erledigt] Numerisches Array - Zugriff auf Elemente TobiasBe PHP Einsteiger 16 27.08.2011 11:34
Wie komme ich an einen bestimmten wert aus einem mehrdimensionalen Array? h.humpol PHP Einsteiger 11 24.08.2011 16:06
[Erledigt] Multidimensionales Array cobra PHP Einsteiger 12 04.08.2011 07:47
[Erledigt] Mehrdimensionalem Array umformen, Index neu setzen und anschließend sortie wooha PHP Einsteiger 3 26.04.2011 12:08
(assoziatives) Array of array => Zugriff auf Werte JavaEntwickler PHP Einsteiger 12 08.03.2011 14:18
[Erledigt] Multidimensionales Array filtern/doppeleintrag entfernen reliC PHP Einsteiger 2 06.12.2010 20:51
[Erledigt] array_slice auf assoziative arrays anwenden Sermon PHP Tipps 2010 13 19.11.2010 10:23
[Erledigt] Problem bei update mit array feldern fulltilt PHP Tipps 2010 6 13.02.2010 00:59
Werte addieren in Multi-Array ArneR PHP Tipps 2008 4 07.11.2008 20:13
Sortierung eines Arrays nach ANZAHL Werte simsalabim PHP Tipps 2008 5 06.11.2007 13:44
Objektorientierter Zugriff auf Multidimensionale Arrays PHP-Fortgeschrittene 31 26.11.2005 21:46
Menü mit Unterpunkten supertramp Beitragsarchiv 7 18.10.2005 22:40
bbcode - Classe PHP-Fortgeschrittene 4 18.09.2004 17:30

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php assoziatives array multi zugriff, multidimensionales array zugriff, php auf erstes array zugreifen ohne den namen zu kennen, php multidimensional array tortzdem über nummer zugreifen

Alle Zeitangaben in WEZ +2. Es ist jetzt 22:54 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum