web-dev-qa-db-fra.com

Supprimer un élément du tableau multidimensionnel en fonction de la valeur

J'essaie de supprimer des éléments d'un tableau multidimensionnel en fonction d'une valeur. Dans ce cas, si la clé de l'année d'un sous-tableau a la valeur 2011, je souhaite que ce sous-tableau sorte.

Pour mémoire, je suis sous PHP 5.2.

Mon tableau ressemble à ceci:

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

Essaye ça:

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

Alors tu l'appellerais comme ceci:

$array = removeElementWithValue($array, "year", 2011);
70
ggreiner

Essaye ça:

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

Pour une valeur unique connue, mettez ceci au début de l'itération à travers le tableau multidimensionnel:

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

Saute simplement cette itération complète si vos critères sont vrais.

Alternativement, vous pouvez faire l'inverse. Pourrait être plus facile à lire, selon les goûts:

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

Je ne sais pas. Peut-être que cela a l'air malin pour certains. Je l'aime bien. Court, rapide et simple.

Dans ce cas, l’objet du filtrage était d’imprimer certains contenus et d’en ignorer certains, en fonction de certains critères. Si vous effectuez le filtrage avant la boucle, vous devrez parcourir tout le contenu deux fois - une fois pour filtrer et une fois pour imprimer le contenu.

Si vous le faites comme ça, dans la boucle, ce n’est pas nécessaire. Vous ne modifierez pas non plus votre tableau, sauf pour l'intérieur de la boucle, ce qui peut être utile si vous ne voulez pas toujours filtrer en fonction de ces critères en particulier.

1
NiDBiLD

Voici comment je l'ai réalisé:

<?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
Abdulrazzak Jakati

Tu devrais essayer comme ça, 
$ mainArray est vos données actuelles 
$ subArray correspond aux données que vous souhaitez supprimer

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

    var_dump(array_values($mainArray));

Cela vous donnera la sortie que vous vouliez avec le nouvel index du tableau.

0
MAULIK MODI