非常大的php字符串神奇地变成了数组

时间:2014-01-24 06:38:41

标签: php arrays string

我收到了“PHP上的数组到字符串转换错误”;

我使用“变量”(应该是一个字符串)作为str_replace的第三个参数。所以总结(最简单的版本是什么):

$str = "very long string";
str_replace("tag", $some_other_array, $str);

$ str正在抛出错误,我一直试图修复它,我尝试的是:

if(is_array($str)) die("its somehow an array");

serialize($str); //inserted this before str_replace call.

我花了一整天的时间,并没有像错误的方式那样愚蠢的东西 - 这是奇怪的事情。我甚至把它转储到一个文件和一个字符串。

我的假设:

  1. 字符串太长,php无法处理它,变成数组。

  2. 在这种情况下,$ str值是嵌套的并递归调用,一般流程可以解释如下:

  3. - 代码

     //pass by reference
    
    function the_function ($something, &$OFFENDING_VAR, $something_else) { 
      while(preg_match($something, $OFFENDING_VAR)) {
    
            $OFFENDING_VAR = str_replace($x, y, $OFFENDING_VAR); // this is the error
    
        }
    
    }
    

    因为str_replace可能会有些奇怪,但这意味着在某些时候str_replace必须返回一个数组。

    请帮我解决这个问题,非常困惑,我浪费了一天的时间。

    ----原始功能代码-----

    //This function gets called with multiple different "Target Variables" Target is the subject 
    //line, from and body of the email filled with << tags >> so the str_replace function knows 
    //where to replace them
    
    function perform_replacements($replacements, &$target, $clean = TRUE,
                                  $start_tag = '<<', $end_tag = '>>', $max_substitutions = 5) { 
        # Construct separate tag and replacement value arrays for use in the substitution loop.
        $tags               = array();
        $replacement_values = array();
        foreach ($replacements as $tag_text => $replacement_value) {
            $tags[] = $start_tag . $tag_text . $end_tag;
            $replacement_values[] = $replacement_value;
        }
    
        # TODO: this badly needs refactoring
        # TODO: auto upgrade <<foo>> to <<foo_html>> if foo_html exists and acting on html template
    
        # Construct a regular expression for use in scanning for tags.
        $tag_match = '/' . preg_quote($start_tag) . '\w+' . preg_quote($end_tag) . '/'; 
    
        # Perform the substitution until all valid tags are replaced, or the maximum substitutions
        # limit is reached.
        $substitution_count = 0; 
        while (preg_match ($tag_match, $target) && ($substitution_count++ < $max_substitutions)) {
            $target = serialize($target);
            $temp = str_replace($tags,
                        $replacement_values,
                                $target); //This is the line that is failing.
            unset($target);
            $target = $temp;
        }
    
        if ($clean) {
            # Clean up any unused search values.
            $target = preg_replace($tag_match, '', $target);
        }
    }
    

1 个答案:

答案 0 :(得分:0)

您如何知道$str是问题,而不是$some_other_array

来自manual

  

如果搜索和替换是数组,则str_replace()接受一个值   从每个数组中使用它们来搜索和替换主题。如果   replace比搜索值少,然后使用空字符串   其余的替换值。如果search是一个数组,则replace是a   string,然后这个替换字符串用于每个值   搜索。 反过来没有意义,但

如果第一个参数也是第二个参数,那么它只能是一个数组。