Antworten auf deine Fragen:
Neues Thema erstellen

PHP Array anhand Wert löschen (Mehrdimensional)

Hallo,

ich habe ein Array, in diesem Array können x-beliebige Unterarrays mit weiteren Unterarrays sein. (Mehrdimensional) Jetzt ist es mein Anliegen, egal an welcher Stelle ein Array mit einem per Parameter der Funktion übergebenem Wert, erscheint, zu löschen!
Das heißt:
PHP:
<?php

function array_replace_value($arr, $replace){
    
    foreach($arr as $key => $value){
        if(is_array($value)){
            array_replace_value($value);
        }else{
            if($key == $replace){
                unset($arr[$key]);
            }
        }
    }
    print_r($arr);
    exit();
}

$arr = array(
        "hello" => array(
                        "content" => "europe",
                        "city" => "berlin",
                        "comment" => array(
                                        "blabliblubb" => "array eins comment"
                                        )
                    ),
        "comment" => array(
                    "blabla" => "asd"
                    )
        );

echo "<pre>";
print_r($arr);
echo "</pre>";
echo "<br><br><br>\n\n\n";

echo "<pre>";
array_replace_value($arr, "comment");
echo "</pre>";
?>
Wobei meine Schleife den Sinn nicht erfüllt. Das Array zeigt also die Struktur die ein Beispielarray haben könnte, auf. Der Funktion wird das Array übergeben und als zweites der Index-Wert (in meinem Fall ein assoziatives Array). Die Funktion soll das ganze Array durchsuchen und wenn sie ein Array mit dem übergebenem Index-Wert finden, dieses löschen und das gelöscht Array zurückgeben.

Gibt´s da ne Lösung?

LG
 

hub

nicht ganz neu hier

AW: PHP Array anhand Wert löschen (Mehrdimensional)

Moin moin,
die Funktion hat mehrere Fehler. Z.B.:
PHP:
// deine Definition:
function array_replace_value($arr, $replace)
 
//dein recursiver Aufruf:
array_replace_value($value);

Einen brauchbaren Lösungsansatz findest du u.A. im 2. Beispiel des folgenden Links:
http://php.net/manual/de/function.array-search.php

Gruß Ulli

Nachtrag: nicht 2. Beispiel sondern 2. Userbeitrag ...
 
AW: PHP Array anhand Wert löschen (Mehrdimensional)

Moin moin,
die Funktion hat mehrere Fehler. Z.B.:
PHP:
// deine Definition:
function array_replace_value($arr, $replace)
 
//dein recursiver Aufruf:
array_replace_value($value);
Einen brauchbaren Lösungsansatz findest du u.A. im 2. Beispiel des folgenden Links:
http://php.net/manual/de/function.array-search.php

Gruß Ulli

Nachtrag: nicht 2. Beispiel sondern 2. Userbeitrag ...
Danke, ja, das stimmt. Kannst du mir schildern, wie ich die genannte Funktion in meinem Beispiel einsetze?
 

hub

nicht ganz neu hier

AW: PHP Array anhand Wert löschen (Mehrdimensional)

Moin moin,
in Ermangelung an Zeit habe ich mal ein Konstrukt (hoffentlich verständlich) dokumentiert, wie ich es nutze. Es hat den Vorteil, sowohl mit lokalen wie auch globalen Arrays sicher zu funktionieren.
PHP:
function removeElementByKey($arr, $replace)
{
 // erstmal ein array für das ergebnis definieren
 $return = array ();
 // die aktuelle ebene durchlaufen
 foreach ( $arr as $key => $value )
 {
  // ist value eine array, ...
  if ( is_array ( $value ) )
  {
   // ... rufe mich selbst auf und schreibe das ergebnis in 
   // das neue array (recursion)
   $return [ $key ] = removeElementByKey ( $value, $replace ); 
   // schleife abbrechen und mit dem nächsten wert fortfahren
   continue;
  }
  // ist key der gesuchte wert, die schleife mit dem nächsten wert
  // fortsetzen ohne den wert in das neue array zu schreiben
  if ( $key == $replace )
   continue;
  // sonst den wert in das neue array übertragen
  $return [ $key ] = $value;
 }
 // rückgabe des neuen arrays
 return $return;
}
Einfach mal durchtesten, dir gegebenenfalls die Werte an den interessanten Positionen ausgeben lassen ...
Wenn du noch Fragen hast, melde dich nochmal.

Gru Ulli
 
AW: PHP Array anhand Wert löschen (Mehrdimensional)

Moin moin,
in Ermangelung an Zeit habe ich mal ein Konstrukt (hoffentlich verständlich) dokumentiert, wie ich es nutze. Es hat den Vorteil, sowohl mit lokalen wie auch globalen Arrays sicher zu funktionieren.
PHP:
function removeElementByKey($arr, $replace)
{
 // erstmal ein array für das ergebnis definieren
 $return = array ();
 // die aktuelle ebene durchlaufen
 foreach ( $arr as $key => $value )
 {
  // ist value eine array, ...
  if ( is_array ( $value ) )
  {
   // ... rufe mich selbst auf und schreibe das ergebnis in 
   // das neue array (recursion)
   $return [ $key ] = removeElementByKey ( $value, $replace ); 
   // schleife abbrechen und mit dem nächsten wert fortfahren
   continue;
  }
  // ist key der gesuchte wert, die schleife mit dem nächsten wert
  // fortsetzen ohne den wert in das neue array zu schreiben
  if ( $key == $replace )
   continue;
  // sonst den wert in das neue array übertragen
  $return [ $key ] = $value;
 }
 // rückgabe des neuen arrays
 return $return;
}
Einfach mal durchtesten, dir gegebenenfalls die Werte an den interessanten Positionen ausgeben lassen ...
Wenn du noch Fragen hast, melde dich nochmal.

Gru Ulli
Hi und danke für deine Antwort,

das ist gut gemeint und verständlich, doch funktioniert nicht.
Ich habe deine Funktion auf mein Script implementiert und konnte kein positives Result feststellen:
PHP:
<?php

function removeElementByKey($arr, $replace)
{
 // erstmal ein array für das ergebnis definieren
 $return = array ();
 // die aktuelle ebene durchlaufen
 foreach ( $arr as $key => $value )
 {
  // ist value eine array, ...
  if ( is_array ( $value ) )
  {
   // ... rufe mich selbst auf und schreibe das ergebnis in 
   // das neue array (recursion)
   $return [ $key ] = removeElementByKey ( $value, $replace ); 
   // schleife abbrechen und mit dem nächsten wert fortfahren
   continue;
  }
  // ist key der gesuchte wert, die schleife mit dem nächsten wert
  // fortsetzen ohne den wert in das neue array zu schreiben
  if ( $key == $replace )
   continue;
  // sonst den wert in das neue array übertragen
  $return [ $key ] = $value;
 }
 // rückgabe des neuen arrays
 return $return;
}  

$arr = array(
        "hello" => array(
                        "content" => "europe",
                        "city" => "berlin",
                        "comment" => array(
                                        "blabliblubb" => "array eins comment"
                                        )
                    ),
        "comment" => array(
                    "blabla" => "asd"
                    )
        );

echo "<pre>";
print_r($arr);
echo "</pre>";
echo "<br><br><br>\n\n\n";

echo "<pre>";
$new = removeElementByKey($arr, "comment");
print_r($new);
echo "</pre>";

?>
 

hub

nicht ganz neu hier

AW: PHP Array anhand Wert löschen (Mehrdimensional)

Sorry - wenns schnell gehen soll :(
Hier ne getestete Version, aber ohne Kommentare. Vorher war für die Suche nach value, nicht nach key ($k mit $v getauscht). Sorry.
PHP:
unction removeElementByKey($arr, $val) {
 $return = array();
 foreach($arr as $k => $v) {
  if($k == $val) continue;
  if(is_array($v)) {
   $return[$k] = removeElementByKey($v, $val);
   continue;
  }
  $return[$k] = $v;
 }
 return $return;
}

Gruß Ulli
 
AW: PHP Array anhand Wert löschen (Mehrdimensional)

Sorry - wenns schnell gehen soll :(
Hier ne getestete Version, aber ohne Kommentare. Vorher war für die Suche nach value, nicht nach key ($k mit $v getauscht). Sorry.
PHP:
unction removeElementByKey($arr, $val) {
 $return = array();
 foreach($arr as $k => $v) {
  if($k == $val) continue;
  if(is_array($v)) {
   $return[$k] = removeElementByKey($v, $val);
   continue;
  }
  $return[$k] = $v;
 }
 return $return;
}
Gruß Ulli
Sorry, aber das funktioniert nicht:
PHP:
<?php

function removeElementByKey($arr, $replace){
 $return = array();
 foreach($arr as $k => $v) {
  if($k == $val) continue;
  if(is_array($v)) {
   $return[$k] = removeElementByKey($v, $val);
   continue;
  }
  $return[$k] = $v;
 }
 return $return;
}  

$arr = array(
        "hello" => array(
                        "content" => "europe",
                        "city" => "berlin",
                        "comment" => array(
                                        "blabliblubb" => "array eins comment"
                                        )
                    ),
        "comment" => array(
                    "blabla" => "asd"
                    )
        );

echo "<pre>";
$new = removeElementByKey($arr, "comment");
print_r($new);
echo "</pre>";

?>
 

hub

nicht ganz neu hier

AW: PHP Array anhand Wert löschen (Mehrdimensional)

Moin moin,
wie ist dein Kenntnisse in PHP? Ein Tipp für nächste Fragen, schick die Fehlermeldungen mit. Hättest du mal sie gelesen, würde es sicher schon laufen:
PHP:
function removeElementByKey($arr, $replace){
 $return = array();
 foreach($arr as $k => $v) {
  if($k == $replace) continue;
  if(is_array($v)) {
   $return[$k] = removeElementByKey($v, $replace);
   continue;
  }
  $return[$k] = $v;
 }
 return $return;
}

Gruß Ulli
 
AW: PHP Array anhand Wert löschen (Mehrdimensional)

Moin moin,
wie ist dein Kenntnisse in PHP? Ein Tipp für nächste Fragen, schick die Fehlermeldungen mit. Hättest du mal sie gelesen, würde es sicher schon laufen:
PHP:
function removeElementByKey($arr, $replace){
 $return = array();
 foreach($arr as $k => $v) {
  if($k == $replace) continue;
  if(is_array($v)) {
   $return[$k] = removeElementByKey($v, $replace);
   continue;
  }
  $return[$k] = $v;
 }
 return $return;
}
Gruß Ulli
Entschuldige bitte, ich möchte nicht unhöflich klingen aber dein Script bewirkt nichts. Ich verstehe die Logik dahinter nicht ganz. Es soll alle Arrays mit dem Index "comment" löschen, egal in welcher Dimension sie sich befinden. Dein Script gibt mir haar genau das aus, was ich ihm zum verarbeiten gegeben habe (siehe Codebeispiel oben).
 

Duddle

Posting-Frequenz: 14µHz

AW: PHP Array anhand Wert löschen (Mehrdimensional)

Bei mir funktioniert hubs Code, wenn ich ihn 1:1 übernehme und mit deinem Beispiel kombiniere. Die Logik ist auch korrekt. Der Fehler liegt also entweder in deiner Anwendung oder im Kontext.


Duddle
 

hub

nicht ganz neu hier

AW: PHP Array anhand Wert löschen (Mehrdimensional)

Moin,
der letzte Code arbeitet tadellos mit deinem Test - Array.
Die Function macht nichts anderes als eine 1:1 Kopie des übergebenen Arrays zu erstellen, mit der Ausnahme des unter $replace angegebenen Keys ...

Gruß Ulli
Seh gerade, war jemand schneller :) hatte vorsichtshalber noch geprüft
 
AW: PHP Array anhand Wert löschen (Mehrdimensional)

Also,
folgenden Code verwende ich und das ist mein ganzer Code:
PHP:
<?php

function removeElementByKey($arr, $replace){
 $return = array();
 foreach($arr as $k => $v) {
  if($k == $val) continue;
  if(is_array($v)) {
   $return[$k] = removeElementByKey($v, $val);
   continue;
  }
  $return[$k] = $v;
 }
 return $return;
}  

$arr = array(
        "arrr" => array(
                        "content" => "europe",
                        "city" => "berlin",
                        "comment" => array(
                                        "blabliblubb" => "Kommentar"
                                        )
                    ),
        "comment" => array(
                    "comment" => "Kommentar",
                    "blabla" => "asd"
                    )
        );

echo "<pre>";
print_r($arr);
echo "</pre>";

echo "<pre>";
$new = removeElementByKey($arr, "comment");
print_r($new);
echo "</pre>";

?>
Mein Ergebnis ist wie bereits erwähnt:

Code:
Array
(
    [arrr] => Array
        (
            [content] => europe
            [city] => berlin
            [comment] => Array
                (
                    [blabliblubb] => Kommentar
                )

        )

    [comment] => Array
        (
            [comment] => Kommentar
            [blabla] => asd
        )

)

Array
(
    [arrr] => Array
        (
            [content] => europe
            [city] => berlin
            [comment] => Array
                (
                    [blabliblubb] => Kommentar
                )

        )

    [comment] => Array
        (
            [comment] => Kommentar
            [blabla] => asd
        )

)


Das im Array verwendete "comment" wurde in welcher Hierarchie auch immer, nicht gelöscht.
 

hub

nicht ganz neu hier

AW: PHP Array anhand Wert löschen (Mehrdimensional)

Falsche Version, nimm den letzten code oder benne die beiden Variablen "$val" in "$replace" um. Dann läufts. wenn ich da für ein wenig Verwirrung - sorry :(
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.565
Beiträge
1.538.067
Mitglieder
67.488
Neuestes Mitglied
Andrew56524
Oben