J'ai un tableau comme celui-là
$str = 'baz->foo->boo'; function array_unset($str, $arr) { // magic here unset($arr['baz']['foo']['boo']); return $arr; }
3 Réponses :
quelque chose à la volée qui pourrait fonctionner pour vous:
$str = 'bar,foo,boo'; function array_unset($str,&$arr) { $path = explode(',',$str); $buf = $arr; for($i=0;$i<count($path)-1;$i++) { $buf = &$buf[$path[$i]]; } unset($buf); }
Ça ne marche pas. À partir du Documentation : Si une variable passée par La référence est non définie () à l'intérieur d'une fonction, seule la variable locale est détruite. La variable dans l'environnement appelant conservera la même valeur qu'avant non défini () a été appelée. I>
Nope ... cela n'affecte pas $ Arr.
Puisque vous ne pouvez pas appeler non définitive sur un élément référencé, vous devez utiliser une autre astuce: Essence, vous traversez l'arbre de la matrice mais gardez une référence au dernier tableau ( avant-dernière noeud), à partir duquel vous souhaitez supprimer le nœud. Ensuite, vous appelez Vérifiez ce codepad p> p> nonset code> sur le dernier tableau, passant le dernier nœud comme une touche. P>
Bon sang ... c'est intelligent. BTW ont 2 questions. 1) Pourquoi vous utilisez Split? Simple Explorez le travail totalement bien. 2) Pourquoi vous mettez l'argument $ ARR par référence?
1) En utilisant beaucoup de queue de QT / C # dernières semaines, où ils ont tendance à utiliser «Split», explosez simplement de belles idées. 2) Vous devez conserver une référence à la matrice d'origine à tout moment, sinon, non définit ne supprimera que le nœud de la copie au lieu de la matrice d'origine.
Vous pouvez utiliser $ globaux à la place si vous avez le nom de la variable de tableau passée dans le paramètre. (de la DOC: à UNET () une variable globale à l'intérieur d'une fonction, utilisez ensuite le tableau $ Globals pour faire i>)
@antoox: L'utilisation de $ globales s'attend à ce que votre réseau soit défini à portée mondiale, que j'ai tendance à éviter. Le code de ma réponse est plus portable et peut facilement être adopté pour travailler dans une approche OO.
Mon argument $ ARR a été tiré de l'objet. De toute façon, cela ne peut pas changer de cette fonction ... C'est pourquoi j'ai été confondu de la mettre en référence. À mon avis sur mon établissement et désapprimez Global Varibles Un peu de sorcière de travail supplémentaire ne nécessite pas ici
@Remtsoy Oui, prenez la manipulation qui vous convient. C'est juste une autre méthode.
Celui-ci est similaire à Wouter Huystruit. La différence est qu'elle renvoie NULL si vous passez sur un chemin non valide.
function array_unset(&$array, $path) { $pieces = explode('.', $path); $i = 0; while($i < count($pieces)-1) { $piece = $pieces[$i]; if (!is_array($array) || !array_key_exists($piece, $array)) { return null; } $array = &$array[$piece]; $i++; } $piece = end($pieces); unset($array[$piece]); return $array; }