代码之家  ›  专栏  ›  技术社区  ›  Shy

致命错误:允许的内存大小在循环通过14个元素长的单字符数组时耗尽

  •  2
  • Shy  · 技术社区  · 6 年前

    我有一个简单的字符串。我需要生成一个输出数组,这样每两个连续字符的顺序就会颠倒。

    输入字符串为 14f05000034e69 Array [4, 1, 0, f, 0, 5, 0, 0, 4, 3, 6, e, 9, 6] .

    以下是我的PHP代码:

    $myString = "14f05000034e69";
    $myStringArray = str_split($myString);
    
    $newArray = array();
    for ($index=0; $index<count($myStringArray)-1; $index+2) {
        $newArray[] = $myStringArray[$index+1];
        $newArray[] = $myStringArray[$index];
    }
    
    print_r($newArray);
    

    致命错误:允许的内存大小134217728字节在/var/www/html中耗尽(试图分配134217736字节)/测试.php第8行

    问题是为什么以及如何修复它?

    4 回复  |  直到 6 年前
        1
  •  2
  •   pr1nc3    6 年前
    <?php
    
    
    $myString = "14f05000034e69";
    $myStringArray = str_split($myString);
    
    $i=0;
    foreach($myStringArray as $row){
        if(array_key_exists($i,$myStringArray)) {
            $newArray[$i] = $myStringArray[$i + 1];
            $newArray[$i + 1] = $myStringArray[$i];
            $i = $i + 2;
        }
    }
    
    echo '<pre>';
    print_r($newArray);
    

    基本上,我像你一样分裂弦,但我用新的数组位置,在我的新数组中按我想要的位置,这就是为什么我用一个计数器。

    输出为:

    Array
    (
        [0] => 4
        [1] => 1
        [2] => 0
        [3] => f
        [4] => 0
        [5] => 5
        [6] => 0
        [7] => 0
        [8] => 3
        [9] => 0
        [10] => e
        [11] => 4
        [12] => 9
        [13] => 6
    )
    

    基本上我认为我需要循环两个数组,但每次循环我需要处理两个数组位置,然后接下来的两个。

    所以我要处理我的问题 $new_array $i+1

    如果我不在那里用它,用简单的 $newArray[] $i

    我的 计数器设置在每个循环的末尾,以便按照步骤2移动。

        2
  •  2
  •   Nigel Ren    6 年前

    我能想到的最短的替代方法是使用一些数组方法。。。

    $myString = "14f05000034e69";
    
    $out = str_split(implode(array_map ('strrev', str_split($myString, 2))));
    
    print_r( $out );
    

    str_split() 将其拆分为2个字符块,然后使用 array_map() strrev() 把每一项倒过来然后 implode() 把它们都放回去。

    外部呼叫 str\u split()

        3
  •  2
  •   Rafael    6 年前

    在我看来,str\u split在这个操作中是多余的,字符串可以像数组一样迭代,如下所示:

    $myString = "14f05000034e69";
    
    $newArray = array();
    for ($index=0; $index<strlen($myString)-1; $index+=2) 
    {
        $newArray[] = $myString[$index+1];
        $newArray[] = $myString[$index];
    }
    
    print_r($newArray);
    

    但是,是的,正如前面所说,只是在for循环中缺少+=。

    我在regex上做了一个小测试,看看它是否可以实现,就像一个魅力。当然,在这种情况下,我只传递一个字符串。:)

    $myString = "14f05000034e69";
    
    $test = preg_replace('/(.)(.)/', '$2$1', $myString);
    
    echo $test;
    

    这是我能想出的最优雅的解决办法。

    此处测试的代码: https://3v4l.org/mtdca

    https://3v4l.org/nI4UP

        4
  •  2
  •   Elementary    6 年前

    一个答案已经被标记为解决方案,还有许多其他的答案,但是我认为这可以帮助我们知道,我们可以实现字符串本身的反转,然后分裂它。如果不需要数组,我们只需要字符串。这个我们使用更少记忆的方式我认为:

        $myString = "14f05000034e69";
        $length=strlen($myString);
        for ($index=-1, $length=$length%2==0?$length-1:$length-2; $index<$length-1; $index+=2) {
            $tmp=$myString[$index+1];
            $myString[$index+1]=$myString[$index+2];
            $myString[$index+2]=$tmp;
        }
    
    
    print_r(str_split($myString));// return an array 
    print_r($myString); //here a string
    

    这可以处理长度可变的字符串