2008-10-22 7 views
0

Je pense que des questions comme celles-ci sont la raison pour laquelle je n'aime pas travailler avec PHP. Le manuel est bon, si vous pouvez trouver ce que vous cherchez. Après avoir lu le Array Functions, je n'en ai pas vu un qui fournisse la fonctionnalité dont j'ai besoin.Existe-t-il une fonction PHP pour supprimer toutes les paires clé/valeur ayant une certaine valeur dans un tableau?

J'ai un tableau (dans mon cas, numériquement indexé) que je veux scanner pour une valeur particulière et, si c'est le cas, le supprimer. Et puis, lorsque toutes les instances de cette valeur ont été supprimées, je veux réorganiser le tableau en utilisant array_values.

+0

Je suis curieux de savoir pourquoi ce qui downvoted ... –

+0

Oui, moi aussi. Peut-être à cause de votre critique implicite de la langue ... ah. –

Répondre

6

array_diff est ce que vous voulez.

$array1 = array("a" => "green", "red", "blue", "red"); 
$array2 = array("b" => "green", "yellow", "red"); 
$result = array_diff($array1, $array2); 

Résultat: "blue".

+0

Merci. Je pense que cela aurait aidé si cela s'appelait quelque chose comme array_prune, array_remove, ou quelque chose d'autre plus descriptif. Merci encore. –

+0

Je suis d'accord que les noms de la fonction PHP (tableau) sont quelque peu arbitraires et incohérents. J'ai souvent passé beaucoup de temps à chercher la bonne fonction moi-même. –

+0

Surtout quand je n'ouvre pas toutes les fonctions et que je lis les détails. Je ne savais même pas à partir de "Calcule la différence de tableaux" que cette fonction renvoyait un tableau, donc je l'ai rejeté et continué à lire. Je pensais qu'il pourrait renvoyer un diff entier, comme une distance de levenshein (sp?) Entre les tableaux. –

2

Juste pour ajouter à cette ...

array_diff semble montrer des éléments dans le premier tableau qui ne figure pas dans le second tableau. Il ne montre pas les éléments qui n'apparaissent que dans l'un ou l'autre tableau.

par exemple.

<? 
$test = "hello"; 
$array1 = array("a" => "green", "red", "bicycle", "red"); 
$array2 = array("b" => "green", "yellow", "red", "blue", "yellow", "pink"); 
$result = array_diff($array1, $array2); 
print_r ($result); 
?> 

retours

Array 
(
    [1] => bicycle 
) 
0

J'aime la fonction array_diff, mais j'ai mon seul scénarisé un si vous ne voulez pas transmettre un tableau:

function array_unset_value($value, &$array) { 
    $key = array_search($value, $array); 
    while ($key !== false) { 
     unset($array[$key]); 
     $key = array_search($value, $array); 
    } 
} 
0

array_filter fait pour vous . Vous avez juste besoin de fournir une fonction de rappel de filtre:

function myFilter($Value){ 
    if($Value == 'red'){ 
     return false; 
    } 
    return true; 
} 

$Values = array("a" => "green", "red", "bicycle", "red"); 

$Values = array_filter($Values, 'myFilter'); 

retours:

array { 
    ["a"] => "green" 
    [1] => "bicycle" 
} 

La fonction de filtre doit renvoyer true pour les valeurs que vous souhaitez conserver et faux pour ceux que vous souhaitez supprimer. Ensuite, allez-y et utilisez array_values ​​pour ré-indexer le tableau. par exemple.

$Values = array_values(array_filter($Values, 'myFilter')); 

Si vous faites cela dans un objet et que vous voulez appeler une méthode de filtre dans l'objet que vous pouvez utiliser ce formulaire pour le rappel:

array_filter($Values, array($this,'myFilter')); 
0

Reconstruire cette fonction « impossible », je 'D suggérer:
fonction pf_cleanarray ($ arraytoclean = faux, $ to_explode = faux, $ delimiter = false) { /* PortalPress.org 2011 [maintenir ce commentaire, s'il vous plaît] - nettoie un tableau jusqu'à NULL ou fait un tableau avec contenu; utiliser avec soin et mieux ne pas utiliser sur la même longueur en fonction des tableaux [associatifs]


Cela semble terrible, je sais, surtout sans indentation sur Stackoverflow. Mais lors de la reconstruction, il peut s'agir d'un outil très utile et dynamique, utilisant seulement les fonctions les plus simples, de sorte que vous serez capable de manipuler les clés et les valeurs à volonté sur un multi-array. La fonction clé est de supprimer des valeurs vides ou de faire un tableau avec exploser, c'est propre, mais avec un peu de problème, il peut être transformé en une fonction qui élimine les éléments en fonction de la clé ou de la valeur. - Igor M.-

Exemple simple:
$ A [0] [0] [0] [0] [0] [0] = "A";
$ A [1] [0] [0] [0] [0] [0] = "";
$ A [2] [0] [0] [0] [0] [0] = "";
$ A [0] [0] [0] [0] [0] [1] = "";
$ A [1] [0] [0] [0] [0] [1] = "";
$ A [2] [0] [0] [0] [0] [1] = "";
$ A [0] [0] [0] [0] [0] [2] = "";
$ A [1] [0] [0] [0] [0] [2] = "";
$ A [2] [0] [0] [0] [0] [2] = "";
$ A [0] [0] [0] [0] [0] [3] = "";
$ A [1] [0] [0] [0] [0] [3] = "";
$ A [2] [0] [0] [0] [0] [3] = "";
$ A [0] [0] [0] [0] [0] [4] = "";
$ A [1] [0] [0] [0] [0] [4] = "";
$ A [2] [0] [0] [0] [0] [4] = "";
$ A [0] [0] [0] [0] [0] [5] = "";
$ A [1] [0] [0] [0] [0] [5] = "A";
$ A [2] [0] [0] [0] [0] [5] = "";
Tableau $ A: Array ([0] => Array ([0] => Array ([0] => Array ([0] => Array ([0] => Array ([0] => A [1] => [2] => [4] => [5] =>)))))
[1] => Array ([0] => Array ([0] => Array ([0] => Array ([0] => Array ([0] => [1] => [2] => [3] => [4] => [5] => A)))))
[2] => Array ([0] => Array ([0] => Array ([0] => Array ([0] => Array ([0] => [1] = > [2] => [3] => [4] => [5] =>))))))
Résultats en $ A:
Tableau ([0] => Tableau ([0] => Tableau ([0] => Tableau ([0] => Tableau ([0] => Tableau ([0] => A)))))
[1] => Tableau ([0] => Tableau ([0] => Tableau ([0] => Tableau ([0] => Tableau ([0] => A))))))
*/
if ($ arraytoclean === 0 | | $ Arraytoclean) {
si) {
if ($ to_explode & & delimiter $) {
$ arraytoclean = explode (delimiter $, arraytoclean de $) (is_array (arraytoclean de $!);
} else {
$ arraytoclean = Tableau ($ arraytoclean);
}
}
$ nZx = 0;
$ keyarray = array_keys ($ arraytoclean);
for ($ Nyx = 0; $ Nyx $ keydigit = true;
si (keyarray $ [$ Nyx] == Nyx $) {$
keydigit = false;
break;}
!
}
for ($ NYX! = 0 $ Nyx si (is_array ($ arraytoclean [keyarray $ [Nyx $]])) {
if ($ arraytoclean [keyarray $ [Nyx $]]) {
si (! isset ($ retarraytoclean)) {
$ retarraytoclean = Array();
}
$ retarraytoclean [(($ keydigit)?$ nZx: $ keyarray [$ nYx])] = $ arraytoclean [$ keyarray [$ nYx]];
$ nZx ++;
}
} else {
$ temparr = pf_cleanarray ($ arraytoclean [$ keyarray [$ nYx]]); Si ($ temparr) {
if (! Isset ($ retarraytoclean)) {
$ retarraytoclean = Array(); $
}
$ retarraytoclean [(($ keydigit)? $ NZx: $ keyarray [$ nYx])] = $ temparr;
$ nZx ++;
}}

}}

if (isset (retarraytoclean de $)) {
retour (retarraytoclean de $);
} else {
return (NULL);
}}

+1

M - indenter le code 4 espaces ou sélectionner et utiliser le bouton '{}'. Voir markdown [aide] (http://stackoverflow.com/editing-help) pour plus d'informations. – McDowell

+0

J'ai essayé de modifier votre code pour le formatage, mais .. ne pouvait pas. Aussi, il n'y a pas besoin de commentaires comme '/ * PortalPress.org 2011 [maintenir ce commentaire, s'il vous plaît] * /', puisque l'utilisation de _anything_ de Stack Overflow nécessite une attribution selon les termes de notre licence. Si quelqu'un utilise ce code, il doit créer un lien vers cette réponse, ainsi que vers votre page d'utilisateur. Il n'est pas nécessaire d'introduire des restrictions supplémentaires. –

Questions connexes