J'ai le tableau suivant que j'ai besoin de boucler de manière récursive et de supprimer tous les tableaux d'enfants qui ont la clé "champs". J'ai essayé un filtre d'array, mais j'ai du mal à ne pas travailler. C'est comme ça que j'en ai besoin de ressembler à: P> $myarray = array(
'Item' => array(
'Part' => array(
)
),
'Owner' => array(
'Company' => array(
'Locations' => array(
'State' => array(
)
)
)
)
);
11 Réponses :
donner une photo de cette fonction. Il retirera les clés avec des «champs» et laissera le reste de la matrice.
function unsetFields($myarray) {
if (isset($myarray['fields']))
unset($myarray['fields']);
foreach ($myarray as $key => $value)
$myarray[$key] = unsetFields($value);
return $myarray;
}
Si vous souhaitez utiliser de manière récursive, vous devez transmettre la matrice en tant que Référence a>, sinon vous faites beaucoup de copier inutilement: function recursive_unset(&$array, $unwanted_key) {
unset($array[$unwanted_key]);
foreach ($array as &$value) {
if (is_array($value)) {
recursive_unset($value, $unwanted_key);
}
}
}
Je ne suis pas sûr que cela soit correct. Du manuel PHP: si une variable passée par 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. PHP.net/Manual/fr/funcunt.unset.php
@Gerbus: Cette déclaration ne s'applique qu'à la variable elle-même, pas ses valeurs i> (ou clés de tableau dans ce cas). La modification de la matrice elle-même n'invalide pas la référence à la matrice transmise. En d'autres termes: vous seriez correct si le code contenait nonset ($ TRAY); code>, mais ce code désintègre une clé matrice.
Ma suggestion:
Isset n'est pas le meilleur dans ce cas, devrait utiliser Array_Key_exists PHP $ a = ['Key' => Null]; var_dump (Isset ($ A ['Key'])); // renvoie false var_dump (array_key_exists ("touche", $ a)); // retourne vrai
marche récupération de la matrice (par référence) et non défini les touches pertinentes.
clear_fields($myarray);
print_r($myarray);
function clear_fields(&$parent) {
unset($parent['fields']);
foreach ($parent as $k => &$v) {
if (is_array($v)) {
clear_fields($v);
}
}
}
array (
'Item' =>
array (
'Part' =>
array (
),
),
'Owner' =>
array (
'Company' =>
array (
'Locations' =>
array (
'State' =>
array (
),
),
),
),
)
vous voulez array_walk
NON Array_Walk State que si vous non définissez un élément que le " Comportement de cette fonction est indéfini et imprévisible "?
@Greatwitenorth, ça dit ça. Cela pourrait fonctionner, mais c'est probablement préférable de l'éviter malheureusement.
ne fonctionne pas dans PHP 7 car le passage par référence a été obsolète
function recursive_unset(&$array, $unwanted_key) {
if (!is_array($array) || empty($unwanted_key))
return false;
unset($array[$unwanted_key]);
foreach ($array as &$value) {
if (is_array($value)) {
recursive_unset($value, $unwanted_key);
}
}
}
function removeRecursive($haystack,$needle){
if(is_array($haystack)) {
unset($haystack[$needle]);
foreach ($haystack as $k=>$value) {
$haystack[$k] = removeRecursive($value,$needle);
}
}
return $haystack;
}
$new = removeRecursive($old,'key');
J'avais besoin d'avoir un peu plus de granularité dans des tableaux désétatiques et je suis venu avec cela - avec le mauvais eval et d'autres astuces sales.
$post = array(); //some huge array
function array_unset(&$arr,$path){
$str = 'unset($arr[\''.implode('\'][\'',explode('/', $path)).'\']);';
eval($str);
}
$junk = array();
$junk[] = 'property_meta/_edit_lock';
$junk[] = 'property_terms/post_tag';
$junk[] = 'property_terms/property-type/0/term_id';
foreach($junk as $path){
array_unset($post,$path);
}
// unset($arr['property_meta']['_edit_lock']);
// unset($arr['property_terms']['post_tag']);
// unset($arr['property_terms']['property-type']['0']['term_id']);
Code: entrée: p> sortie: p> Array
(
[sweet] => Array
(
[b] => banana
)
[sour] => Array
(
[b] => banana
)
)
Je propose une fonction simple que vous pouvez utiliser pour supprimer plusieurs éléments de tableau en fonction de plusieurs clés.
Juste un peu de changement de code. P>
function removeRecursive($inputArray,$delKey){
if(is_array($inputArray)){
$moreKey = explode(",",$delKey);
foreach($moreKey as $nKey){
unset($inputArray[$nKey]);
foreach($inputArray as $k=>$value) {
$inputArray[$k] = removeRecursive($value,$nKey);
}
}
}
return $inputArray;
}
$inputNew = removeRecursive($input,'keyOne,keyTwo');
print"<pre>";
print_r($inputNew);
print"</pre>";
Quelle valeur "rôle" sera-t-elle après la suppression de l'action?
J'ai juste besoin de «champs» non définis et de laisser partie comme «tableau ()»