detecting infinite array recursion in PHP?

前端 未结 2 524
时光取名叫无心
时光取名叫无心 2021-02-07 11:36

i\'ve just reworked my recursion detection algorithm in my pet project dump_r()

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

detecting object recursion is not too diff

2条回答
  •  失恋的感觉
    2021-02-07 12:09

    Someone will correct me if I am wrong, but PHP is actually detecting recursion at the right moment. Your assignation simply creates the additional cycle. The example should be:

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

    Which will result in

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

    As expected.


    Well, I got a bit curious myself how to detect recursion and I started to Google. I found this article http://noteslog.com/post/detecting-recursive-dependencies-in-php-composite-values/ and this solution:

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

提交回复
热议问题