Fatal error: Allowed memory size exhausted while looping through a 14 element long single-character-array
Fatal error: Allowed memory size exhausted while looping through a 14 element long single-character-array
我有一个简单的字符串。我需要生成一个输出数组,以便反转每 2 个连续字符的顺序。
输入字符串是 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);
它给了我
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 134217736 bytes) in /var/www/html/test.php on line 8
问题是为什么以及如何解决?
<?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);
我找到了一个稍微 "dirty" 的解决方法,但我设法按照你的要求做了。
基本上我像你一样拆分字符串,但我使用周围的新数组位置并将新数组推入我想要的位置,这就是我为此使用计数器的原因。
输出为:
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
)
基本上我认为我需要将数组循环两次,但每次循环我都需要处理 2 个数组位置,然后是接下来的两个。
所以这导致我处理我的 $new_array
的方式是我在当前位置和下一个位置同时推送数据,这就是计数器 $i+1
的原因用于处理数组位置。
如果我没有在那里使用它并使用简单的 $newArray[]
它会将数据放在我当前的位置并在第二步再次覆盖它而且我无法将我的数组指针移动到位置 1, 3、5、6 等等,这就是为什么我 "forcing" 它使用我的 $i
计数器所以我一直指向每个位置。
我的 $i
计数器设置在每个循环结束时随步骤 2 移动。
我能想到的最短的替代方法是改用一些数组方法...
$myString = "14f05000034e69";
$out = str_split(implode(array_map ('strrev', str_split($myString, 2))));
print_r( $out );
这使用 str_split()
将其拆分为 2 个字符块,然后使用 array_map()
和 strrev()
反转每个项目,然后 implode()
将它们全部放回去.
对 str_split()
的外部调用只是将结果拆分回数组中的 1 个字符元素以供输出(如果您只需要字符串本身,请忽略此部分)
在我看来,str_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 循环中缺少 +=。
我对正则表达式做了一个小测试,看看是否可以完成,效果很好。但当然,在这种情况下我只提供一个字符串。 :)
$myString = "14f05000034e69";
$test = preg_replace('/(.)(.)/', '', $myString);
echo $test;
这是我能想到的最优雅的解决方案。
此处测试的代码:https://3v4l.org/mtdca
对于正则表达式:https://3v4l.org/nI4UP
一个答案已经被标记为许多其他答案的解决方案,但是我认为这有助于了解我们可以在字符串本身中实现反转然后拆分 it.If 不需要数组我们可以保持 string.This 使用更少内存的方式,我认为:
$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
这可以处理可变长度的字符串
我有一个简单的字符串。我需要生成一个输出数组,以便反转每 2 个连续字符的顺序。
输入字符串是 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);
它给了我
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 134217736 bytes) in /var/www/html/test.php on line 8
问题是为什么以及如何解决?
<?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);
我找到了一个稍微 "dirty" 的解决方法,但我设法按照你的要求做了。
基本上我像你一样拆分字符串,但我使用周围的新数组位置并将新数组推入我想要的位置,这就是我为此使用计数器的原因。
输出为:
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
)
基本上我认为我需要将数组循环两次,但每次循环我都需要处理 2 个数组位置,然后是接下来的两个。
所以这导致我处理我的 $new_array
的方式是我在当前位置和下一个位置同时推送数据,这就是计数器 $i+1
的原因用于处理数组位置。
如果我没有在那里使用它并使用简单的 $newArray[]
它会将数据放在我当前的位置并在第二步再次覆盖它而且我无法将我的数组指针移动到位置 1, 3、5、6 等等,这就是为什么我 "forcing" 它使用我的 $i
计数器所以我一直指向每个位置。
我的 $i
计数器设置在每个循环结束时随步骤 2 移动。
我能想到的最短的替代方法是改用一些数组方法...
$myString = "14f05000034e69";
$out = str_split(implode(array_map ('strrev', str_split($myString, 2))));
print_r( $out );
这使用 str_split()
将其拆分为 2 个字符块,然后使用 array_map()
和 strrev()
反转每个项目,然后 implode()
将它们全部放回去.
对 str_split()
的外部调用只是将结果拆分回数组中的 1 个字符元素以供输出(如果您只需要字符串本身,请忽略此部分)
在我看来,str_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 循环中缺少 +=。
我对正则表达式做了一个小测试,看看是否可以完成,效果很好。但当然,在这种情况下我只提供一个字符串。 :)
$myString = "14f05000034e69";
$test = preg_replace('/(.)(.)/', '', $myString);
echo $test;
这是我能想到的最优雅的解决方案。
此处测试的代码:https://3v4l.org/mtdca
对于正则表达式:https://3v4l.org/nI4UP
一个答案已经被标记为许多其他答案的解决方案,但是我认为这有助于了解我们可以在字符串本身中实现反转然后拆分 it.If 不需要数组我们可以保持 string.This 使用更少内存的方式,我认为:
$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
这可以处理可变长度的字符串