2012-01-28 18 views
14

मैं सिर्फ मेरे पालतू परियोजना dump_r()PHP में अनंत सरणी रिकर्सन का पता लगाना? आप वस्तु दृष्टान्त की अनूठी आंतरिक आईडी प्राप्त करने के लिए spl_object_hash() का उपयोग -

https://github.com/leeoniya/dump_r.php

वस्तु प्रत्यावर्तन का पता लगाने के लिए भी मुश्किल नहीं है में अपने प्रत्यावर्तन का पता लगाने एल्गोरिथ्म पर फिर से काम किया है , इसे एक नोड में स्टोर करें और अन्य नोड्स डंप करते समय इसके खिलाफ तुलना करें।

सरणी रिकर्सन डिटेक्शन के लिए, मैं थोड़ी परेशान हूं, मुझे कुछ भी उपयोगी नहीं मिला है। PHP स्वयं रिकर्सन की पहचान करने में सक्षम है, हालांकि ऐसा लगता है कि यह एक चक्र बहुत देर हो चुकी है। संपादित करें: nvm, यह तब होता है जहां यह जरूरत के लिए :)

$arr = array(); 
$arr[] = array(&$arr); 
print_r($arr); 

यह प्रत्यावर्तन ढेर में सब कुछ का ट्रैक रखने का सहारा और हर दूसरे सरणी तत्व के खिलाफ उथले तुलना क्या संबंध है?

किसी भी मदद की सराहना की जाएगी,
धन्यवाद!

+0

लॉल - eewwwwww। – leeoniya

+1

आपके quesiton का उत्तर नहीं है, लेकिन मैंने समाधान देखा है जो रिकर्सन को इंगित करने वाली स्ट्रिंग के लिए 'print_r ($ var, true) 'का परीक्षण करता है। यह उतना ही बुरा है जितना आप प्राप्त कर सकते हैं लेकिन काम करता है ... एक सभ्य समझौता के लिए [यहां] देखें (http://noteslog.com/post/detecting-recursive- निर्भरता-in-php-composite-values/)। – Basic

+0

मैंने अपनी टिप्पणी को एक उदाहरण के लिंक के लिए हटा दिया/संपादित किया है, लेकिन मैं सहमत हूं, यह – Basic

उत्तर

9
पीएचपी के कॉल-दर-मूल्य तंत्र की वजह से

, एकमात्र समाधान मैं यहाँ देखें संदर्भ द्वारा सरणी पुनरावृति, और उस में एक मनमाना मूल्य निर्धारित करने के लिए, आप जो बाद में जांच अगर यह अगर तुम से पहले वहाँ थे पता लगाने के लिए मौजूद है:

function iterate_array(&$arr){ 

    if(!is_array($arr)){ 
    print $arr; 
    return; 
    } 

    // if this key is present, it means you already walked this array 
    if(isset($arr['__been_here'])){ 
    print 'RECURSION'; 
    return; 
    } 

    $arr['__been_here'] = true; 

    foreach($arr as $key => &$value){ 

    // print your values here, or do your stuff 
    if($key !== '__been_here'){ 
     if(is_array($value)){ 
     iterate_array($value); 
     } 

     print $value; 
    } 
    } 

    // you need to unset it when done because you're working with a reference... 
    unset($arr['__been_here']); 

} 

आप किसी अन्य समारोह है कि संदर्भ के बजाय मान स्वीकार करता है में इस समारोह लपेट सकता है, लेकिन फिर तुम पर 2 स्तर से प्रत्यावर्तन नोटिस मिलेगा। मुझे लगता है कि print_r भी वही करता है।

+0

** यह ** वह समाधान है जिसे मैं उम्मीद कर रहा था - सरल और भयानक। – leeoniya

3

अगर मैं गलत हूं तो कोई मुझे सही करेगा, लेकिन PHP वास्तव में सही समय पर रिकर्सन का पता लगा रहा है। आपका असाइनमेंट बस अतिरिक्त चक्र बनाता है। उदाहरण होना चाहिए:

$arr = array(); 
$arr = array(&$arr); 

कौन सा

array(1) { [0]=> &array(1) { [0]=> *RECURSION* } } 

में परिणाम होगा उम्मीद थी।


ठीक है, मुझे थोड़ा उत्सुकता है कि कैसे रिकर्सन का पता लगाना है और मैंने Google से शुरुआत की। मैं इस लेख http://noteslog.com/post/detecting-recursive-dependencies-in-php-composite-values/ और इस समाधान पाया:

function hasRecursiveDependency($value) 
{ 
    //if PHP detects recursion in a $value, then a printed $value 
    //will contain at least one match for the pattern /\*RECURSION\*/ 
    $printed = print_r($value, true); 
    $recursionMetaUser = preg_match_all('@\*RECURSION\*@', $printed, $matches); 
    if ($recursionMetaUser == 0) 
    { 
     return false; 
    } 
    //if PHP detects recursion in a $value, then a serialized $value 
    //will contain matches for the pattern /\*RECURSION\*/ never because 
    //of metadata of the serialized $value, but only because of user data 
    $serialized = serialize($value); 
    $recursionUser = preg_match_all('@\*RECURSION\*@', $serialized, $matches); 
    //all the matches that are user data instead of metadata of the 
    //printed $value must be ignored 
    $result = $recursionMetaUser > $recursionUser; 
    return $result; 
} 
+0

बदबू आ रही है, आप सही हैं। देर हो चुकी है लेकिन मुझे अभी भी मूल कार्य के बाहर ऐसा करने का एक तरीका चाहिए। – leeoniya

+0

अच्छी तरह से, यह समाधान बिल्कुल वही नहीं है जो मैं उम्मीद कर रहा था क्योंकि यह बड़ी संरचनाओं पर अत्यधिक कर लगा रहा है और आंतरिक अनियंत्रित-गहराई print_r() या serialize पर निर्भर करता है, जो कि प्रोजेक्ट शुरू करने के कारण से शुरू हुआ है, हे , लेकिन http://www.phpsadness.com/ :( – leeoniya