2009-08-01 7 views
8

J'ai deux fonctions que j'utilise pour ajouter ou supprimer des barres obliques d'un combo objet/tableau profondément imbriqué. Le premier "niveau" du tableau est toujours un objet, mais certaines de ses propriétés peuvent être des tableaux ou des objets.La passe PHP par référence dans la fonction récursive ne fonctionne pas

Voici mes deux fonctions:

function objSlash(&$obj, $add=true) 
{ 
    foreach ($obj as $key=>$field) 
    { 
     if (is_object($field)) 
      objSlash($field, $add); 
     else if (is_array($field)) 
      arrSlash($field, $add); 
     else if ($add) 
      $obj->$key = addslashes($field); 
     else 
      $obj->$key = stripslashes($field); 
    } 

    return; 
} 

function arrSlash(&$arr, $add=true) 
{ 
    foreach ($arr as $key=>$field) 
    { 
     if (is_object($field)) 
      objSlash($field, $add); 
     else if (is_array($field)) 
      arrSlash($field, $add); 
     else if ($add) 
      $arr[$key] = addslashes($field); 
     else 
      $arr[$key] = stripslashes($field); 
    } 

    return; 
} 

être appelé comme ceci:

objSlash($obj, false); 

Cependant, la fonction ne supprime pas les barres obliques du tableau imbriqué. L'objet transmis à la fonction est comme suit:

stdClass Object 
(
    [id] => 3 
    [lines] => Array 
     (
      [0] => Array 
       (
        [character] => Name 
        [dialogue] => Something including \"quotes\" 
       ) 
     ) 
) 

Qu'est-ce que j'ai fait de mal? Quelque part le long de la ligne, une référence disparaît ...

Répondre

14

foreach utilise une copie du tableau/objet et non le tableau/elle-même objet:

Note: À moins que le tableau est referenced, foreach fonctionne sur une copie du tableau spécifié et non le tableau lui-même. foreach a des effets secondaires sur le pointeur de tableau. Ne comptez pas sur le pointeur de tableau pendant ou après le foreach sans le réinitialiser.

Il faut donc utiliser soit une référence:

foreach ($arr as $key => &$field) { 
    // … 
} 

Ou utiliser la propriété d'élément de tableau/objet lui-même comme Kuroki Kaze a suggéré à l'aide $arr[$key] au lieu de sa valeur copiée $field.

+0

Merci, '& $ field' travaillé! – DisgruntledGoat

2

foreach fait une copie de la valeur, je suppose.

Essayez d'utiliser objSlash($arr[$key], $add) au lieu de objSlash($field, $add) à l'intérieur de foreach.

+0

Je pense que vous vouliez dire: objSlash ($ arr [$ key], $ ajouter) – Josh

+0

Oui, bien sûr :) –

Questions connexes