webentwicklung-frage-antwort-db.com.de

Element aus mehrdimensionalem Array basierend auf Wert löschen

Ich versuche, Elemente aus einem mehrdimensionalen Array basierend auf einem Wert zu löschen. Wenn in diesem Fall der Schlüssel 'year' eines Subarrays den Wert 2011 hat, möchte ich das Subarray herausgeben.

Nur fürs Protokoll: Ich führe PHP aus. 5.2.

Mein Array sieht so 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
        )
)
37
Bob

Versuche dies:

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);
70
ggreiner

Versuche dies:

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;
}
8
Jacob Relkin
$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);
}
4
ifaour

Setzen Sie diesen Wert für einen einzelnen bekannten Wert am 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
}

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

Alternativ können Sie auch das Gegenteil tun. Kann je nach Geschmack leichter lesbar sein:

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

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

In diesem Fall sah es so aus, als ob die Filterung dazu diente, einige Inhalte auszudrucken und bestimmte Inhalte 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 dies in der Schleife tun, ist dies nicht erforderlich. Sie ändern Ihr Array auch nur innerhalb der Schleife. Dies kann hilfreich sein, wenn Sie nicht immer nach diesen Kriterien filtern möchten.

1
NiDBiLD

So habe ich es erreicht:

<?php 
    print_r($array);
    echo "<br><br>";
    foreach($array as $k => $v){
        echo "k: ".$k." v: ".$v."<br><br>";
        if(($v == 'Toronto') || ($v == 'London')){
            unset($array[$k]);
        }
    }
    echo "<br><br>";
    print_r($array);
?>
0
Jaime Montoya
function removeElementWithValue($array, $value){
    $temp=array(); //Create temp array variable.
    foreach($array as $item){ //access array elements.
        if($item['year'] != $value){ //Skip the value, Which is equal.
        array_Push($temp,$item);  //Push the array element into $temp var.
        }
     }
     return $temp; // Return the $temp array variable.
}

//Simple code to delete element of multidimensional array.
$array = removeElementWithValue($array, "year");
0

Sie sollten auf diese Weise versuchen, 
$ mainArray sind Ihre aktuellen Daten 
$ subArray sind die Daten, die Sie entfernen möchten

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

    var_dump(array_values($mainArray));

Dadurch erhalten Sie die gewünschte Ausgabe mit dem neuen Index des Arrays.

0
MAULIK MODI