2009-08-01 10 views
8

पर काम नहीं कर रहा है मेरे पास दो कार्य हैं जिनका उपयोग मैं गहरा घोंसला वाले ऑब्जेक्ट/सरणी कॉम्बो से स्लैश जोड़ने या निकालने के लिए कर रहा हूं। सरणी का पहला "स्तर" हमेशा एक वस्तु है, लेकिन इसकी कुछ गुण सरणी या वस्तुएं हो सकती हैं।रिकर्सिव फ़ंक्शन में संदर्भ द्वारा PHP पास

यहाँ मेरी दो कार्य हैं:

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

इसलिए की तरह बुलाया जा रहा है:

objSlash($obj, false); 

हालांकि, समारोह नेस्टेड सरणी से स्लैश पट्टी नहीं है। फ़ंक्शन में पारित ऑब्जेक्ट इस प्रकार है:

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

मैंने क्या गलत किया है? रेखा के साथ कहीं एक संदर्भ गायब हो रहा है ...

उत्तर

14

foreach सरणी/वस्तु और न सरणी की एक प्रति का उपयोग करता है/खुद को आपत्ति:

नोट: जब तक सरणी referenced है, foreach निर्दिष्ट सरणी की एक प्रति और न सरणी पर चल रही है अपने आप। foreach सरणी सूचक पर कुछ दुष्प्रभाव हैं। इसे रीसेट किए बिना foreach के दौरान या उसके बाद सरणी पॉइंटर पर भरोसा न करें।

तो या तो एक संदर्भ का उपयोग करें:

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

या Kuroki Kaze की तरह इसकी प्रतिलिपि बनाई मूल्य $field के बजाय $arr[$key] का उपयोग करके सुझाव सरणी तत्व/वस्तु संपत्ति ही इस्तेमाल करते हैं।

+0

धन्यवाद, 'और $ फ़ील्ड 'काम किया! – DisgruntledGoat

2

foreach मान की एक प्रति बनाता है, मुझे लगता है।

objSlash($arr[$key], $add)objSlash($field, $add) के foreach के अंदर इंटैड का उपयोग करने का प्रयास करें।

+0

मुझे लगता है कि आपका मतलब है: objSlash ($ arr [$ key], $ add) – Josh

+0

हां, ज़ाहिर है :) –

संबंधित मुद्दे