11
votes

PHP Touches de tableau de déséquipes récursives si correspondez

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. XXX PRE>

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(
                )
            )
        )
    )    
);


2 commentaires

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 ()»


11 Réponses :


0
votes

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;
}


0 commentaires

37
votes

2 commentaires

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 (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); , mais ce code désintègre une clé matrice.



2
votes

Ma suggestion: xxx


1 commentaires

Isset n'est pas le meilleur dans ce cas, devrait utiliser Array_Key_exists Null]; var_dump (Isset ($ A ['Key'])); // renvoie false var_dump (array_key_exists ("touche", $ a)); // retourne vrai



-1
votes

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);
    }
  }
}


0 commentaires

1
votes
array (
  'Item' => 
  array (
    'Part' => 
    array (
    ),
  ),
  'Owner' => 
  array (
    'Company' => 
    array (
      'Locations' => 
      array (
        'State' => 
        array (
        ),
      ),
    ),
  ),
)

0 commentaires

6
votes

vous voulez array_walk xxx


3 commentaires

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



2
votes
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);
        }
    }
}

0 commentaires

1
votes
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');

0 commentaires

-1
votes

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']);


0 commentaires

0
votes

Code: xxx pré>

entrée: p> xxx pré>

sortie: p>

Array
(
    [sweet] => Array
        (
            [b] => banana
        )

    [sour] => Array
        (
            [b] => banana
        )

)


0 commentaires

0
votes

Je propose une fonction simple que vous pouvez utiliser pour supprimer plusieurs éléments de tableau en fonction de plusieurs clés.

Exemple de détail ici . P>

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>";


0 commentaires