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
)
)
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);
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;
}
$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);
}
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.
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);
?>
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");
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.