Comment puis-je supprimer une entrée de tableau avec une ou plusieurs valeurs dupliquées dans un tableau multidimensionnel? Par exemple si j'ai:
array (size=4)
0 =>
array (size=3)
"food" => string "bread" (length=5)
"color" => string "white" (length=5)
"language" => string "php" (length=3)
1 =>
array (size=3)
"food" => string "rice" (length=4)
"color" => string "purple" (length=6)
"language" => string "c#" (length=2)
2 =>
array (size=3)
"food" => string "pasta" (length=5)
"color" => string "red" (length=3)
"language" => string "php" (length=3)
3 =>
array (size=3)
"food" => string "steak" (length=5)
"color" => string "yellow" (length=6)
"language" => string "ruby" (length=4)
Puisqu'il y a une entrée php dans array [2], je veux supprimer tout l'enregistrement pour pouvoir avoir
array (size=4)
0 =>
array (size=3)
"food" => string "bread" (length=5)
"color" => string "white" (length=5)
"language" => string "php" (length=3)
1 =>
array (size=3)
"food" => string "rice" (length=4)
"color" => string "purple" (length=6)
"language" => string "c#" (length=2)
2 =>
array (size=3)
"food" => string "steak" (length=5)
"color" => string "yellow" (length=6)
"language" => string "ruby" (length=4)
J'ai essayé ce code:
array_map("unserialize", array_unique(array_map("serialize", $array)));
et ça ne marche pas. Qu'est-ce que je fais mal?
Réponses:
0 pour la réponse № 1Puisque vos objets sont tous différents (par exemple, ils ont tous des couleurs différentes), array_unique
ne réduira pas le nombre d'éléments.
A la place, entrez les éléments de votre tableau language
propriété: qui éliminera les doublons php
entrées, puis reconvertit ce tableau associé en un tableau indexé:
foreach($array as $row) {
$result[$row["language"]] = $row;
}
$result = array_values($result);
0 pour la réponse № 2
La solution utilisant array_intersect
et array_merge
fonctions (couvrira les doublons pour toutes les clés):
$arr = [
["food" => "bread", "color" => "white", "language" => "php"],
["food" => "rice", "color" => "purple", "language" => "c#"],
["food" => "pasta", "color" => "red", "language" => "php"],
["food" => "steak", "color" => "yellow", "language" => "ruby"]
];
$values = []; // auxiliary array
foreach ($arr as $k => $a) {
if (array_intersect($values, $a)){
unset($arr[$k]); // removing the whole `entry` if it contains duplicates in any key
} else {
$values = array_merge($values, array_values($a));
}
}
print_r($arr);
Le résultat:
Array
(
[0] => Array
(
[food] => bread
[color] => white
[language] => php
)
[1] => Array
(
[food] => rice
[color] => purple
[language] => c#
)
[3] => Array
(
[food] => steak
[color] => yellow
[language] => ruby
)
)