2010-12-16 8 views
29

Ich versuche Elemente aus einem multidimensionalen Array basierend auf einem Wert zu löschen. Wenn in diesem Fall der Schlüssel "Jahr" eines Unterfelds den Wert 2011 hat, möchte ich dieses Unterfeld herausführen.Lösche Element aus multidimensionalem Array basierend auf Wert

Nur für den Rekord: Ich betreibe PHP 5.2.

Mein Array sieht wie folgt aus:

Array 
(
    [0] => Array 
     (
      [filmId] => 61359 
      [url] => http://www.moviemeter.nl/film/61359 
      [title] => Unstoppable 
      [alternative_title] => 
      [year] => 2011 
      [thumbnail] => http://www.moviemeter.nl/images/covers/thumbs/61000/61359.jpg 
      [average] => 0 
      [votes_count] => 0 
      [similarity] => 100.00 
      [directors_text] => geregisseerd door Richard Harrison 
      [actors_text] => met Chen Shilony, Ruben Crow en David Powell 
      [genres_text] => Drama/Komedie 
      [duration] => 90 
     ) 
    [1] => Array 
     (
      [filmId] => 87923 
      [url] => http://www.moviemeter.nl/film/87923 
      [title] => Unstoppable 
      [alternative_title] => 
      [year] => 2011 
      [thumbnail] => http://www.moviemeter.nl/images/covers/thumbs/87000/87923.jpg 
      [average] => 0 
      [votes_count] => 0 
      [similarity] => 100.00 
      [directors_text] => geregisseerd door Example Director 
      [actors_text] => met Actor 1, Actor 2 en Actor 3 
      [genres_text] => Drama/Komedie 
      [duration] => 90 
     ) 
    [2] => Array 
     (
      [filmId] => 68593 
      [url] => http://www.moviemeter.nl/film/68593 
      [title] => Unstoppable 
      [alternative_title] => 
      [year] => 2010 
      [thumbnail] => http://www.moviemeter.nl/images/covers/thumbs/68000/68593.jpg 
      [average] => 3.3 
      [votes_count] => 191 
      [similarity] => 100.00 
      [directors_text] => geregisseerd door Tony Scott 
      [actors_text] => met Denzel Washington, Chris Pine en Rosario Dawson 
      [genres_text] => Actie/Thriller 
      [duration] => 98 
     ) 
    [3] => Array 
     (
      [filmId] => 17931 
      [url] => http://www.moviemeter.nl/film/17931 
      [title] => Unstoppable 
      [alternative_title] => Nine Lives 
      [year] => 2004 
      [thumbnail] => http://www.moviemeter.nl/images/covers/thumbs/17000/17931.jpg 
      [average] => 2.64 
      [votes_count] => 237 
      [similarity] => 100.00 
      [directors_text] => geregisseerd door David Carson 
      [actors_text] => met Wesley Snipes, Jacqueline Obradors en Mark Sheppard 
      [genres_text] => Actie/Thriller 
      [duration] => 96 
     ) 
) 

Antwort

60

Versuchen Sie folgendes:

function removeElementWithValue($array, $key, $value){ 
    foreach($array as $subKey => $subArray){ 
      if($subArray[$key] == $value){ 
       unset($array[$subKey]); 
      } 
    } 
    return $array; 
} 

Dann würden Sie es so nennen:

$array = removeElementWithValue($array, "year", 2011); 
+0

Ich zweite diese Wahl. Obwohl die Jacob-Lösung sehr elegant ist, würde ich die Rekursion nicht verwenden, wenn das Array eine Schachtelungsebene hat, die im Voraus bekannt ist, wie in dem oben gezeigten Beispiel. Natürlich müssen Sie sich auf Rekursion verlassen (oder eine Kombination aus array_map mit in_array oder ähnlichen Funktionen, die sogar ein wenig schneller sein kann), wenn die Struktur Ihres Arrays nicht im Voraus bekannt ist. – maraspin

+0

Danke für Ihre Antwort! Funktioniert wunderbar! – Bob

+3

Nur eine Nebenbemerkung: Ich konnte das gewünschte Ergebnis nicht erreichen. Ich bin mir nicht sicher, was ich falsch gemacht habe, aber ich habe es in meinem Fall behoben.Ich musste "return $ array;" hinzufügen Nach der foreach-Schleife, und rufen Sie es wie folgt auf: $ array = removeElementWithValue ($ array, "year", 2011); Für Benutzer, die dies in der Zukunft verwenden und den Index neu anordnen möchten, können Sie Folgendes verwenden: $ array = array_values ​​($ array); – Bob

8

Try this:

function remove_element_by_value($arr, $val) { 
    $return = array(); 
    foreach($arr as $k => $v) { 
     if(is_array($v)) { 
     $return[$k] = remove_element_by_value($v, $val); //recursion 
     continue; 
     } 
     if($v == $val) continue; 
     $return[$k] = $v; 
    } 
    return $return; 
} 
+0

Was ist der gleiche Wert in mehreren Sub-Arrays? Sie werden alle entfernt? Können wir ein bestimmtes Sub-Array basierend auf dem Schlüssel ausrichten? – Luke

4
$array[] = array('year' => 2010, "genres_text" => "Drama/Komedie"); 
$array[] = array('year' => 2011, "genres_text" => "Actie/Thriller"); 
$array[] = array('year' => "2010", "genres_text" => "Drama/Komedie"); 
$array[] = array('year' => 2011, "genres_text" => "Romance"); 

print_r(remove_elm($array, "year", 2010)); // removes the first sub-array only 
print_r(remove_elm($array, "year", 201)); // will not remove anything 
print_r(remove_elm($array, "genres_text", "drama", TRUE)); // removes all Drama 
print_r(remove_elm($array, "year", 2011, TRUE)); // removes all 2011 

function remove_elm($arr, $key, $val, $within = FALSE) { 
    foreach ($arr as $i => $array) 
      if ($within && stripos($array[$key], $val) !== FALSE && (gettype($val) === gettype($array[$key]))) 
       unset($arr[$i]); 
      elseif ($array[$key] === $val) 
       unset($arr[$i]); 

    return array_values($arr); 
} 
+0

Danke ifaour. Ich mag deine Lösung, weil ich damit eine Menge machen kann. Ich halte das für eine "zweite" Antwort. – Bob

+0

@B M, zweite akzeptiert? haben wir sowas hier im stackoverflow? Wie auch immer, froh, dass es geholfen hat! – ifaour

1

Für einen einzelnen, bekannten Wert, setzen diese in Anfang der Iteration durch das mehrdimensionale Array:

foreach ($array as $subarray) { 
    //beginning of the loop where you do things with your array 
    if ($subarray->$key == '$valueToRemoveArrayBy') continue; 
    //iterate your stuff 
} 

einfach überspringt die gesamte Iteration, wenn Ihre Kriterien erfüllt sind.

Alternativ können Sie das Gegenteil tun. Könnte einfacher zu lesen, je nach Geschmack sein:

foreach ($array as $subarray) { 
    if ($subarray->$key != $valueToRemoveArrayBy) { 
    //do stuff 
    } 
} 

Ich weiß nicht. Vielleicht sieht das für manche hacky aus. Ich mag es aber. Kurz, schnell und einfach.

Sah aus wie der Zweck der Filterung in diesem Fall war, einige Inhalte auszudrucken und einige, basierend auf bestimmten Kriterien zu überspringen. Wenn Sie die Filterung vor der Schleife durchführen, müssen Sie die gesamte Sache zweimal durchlaufen - einmal zum Filtern und einmal zum Drucken des Inhalts.

Wenn Sie es so machen, innerhalb der Schleife, das ist nicht erforderlich. Sie werden auch Ihr Array nicht verändern, außer innerhalb der Schleife, was hilfreich sein kann, wenn Sie nicht immer nach diesen Kriterien filtern wollen.

0

Sie sollten diese Art und Weise versuchen,
$ mainarray ist Ihre aktuellen Daten
$ Subarray die Daten Sie

foreach ($mainArray as $key => $mainData){ 
     foreach ($subArray as $subData){ 
      if($mainData['dataId'] == $subData['dataId']){ 
       unset($mainArray[$key]); 
       break; 
      } 
     } 
    } 

    var_dump(array_values($mainArray)); 

Dies wird Ihnen Ausgabe, die Sie wollten mit neuen Index von Array entfernen möchten.

Verwandte Themen