У меня есть простая строка. Мне нужно создать выходной массив таким образом, чтобы порядок каждых 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);
И это дает мне
Неустранимая ошибка: допустимый объем памяти 134217728 байт исчерпан (попытался выделить 134217736 байт) в /var/www/html/test.php в строке 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);
Я нашел обходной путь немного «грязным» способом, но мне удалось сделать то, что вы просили.
По сути, я разделяю строку, как вы, но я играю с новыми позициями массива и вставляю в свой новый массив позиции, которые я хочу, поэтому я использовал счетчик для этого.
Выход:
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 и т. д. и т. д., поэтому я «заставляю» его использовать мой $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('/(.)(.)/', '$2$1', $myString);
echo $test;
Это самое элегантное решение, которое я мог придумать.
Код протестирован здесь: https://3v4l.org/mtdca
И для регулярного выражения: https://3v4l.org/nI4UP
Ответ уже помечен как решение, как и многие другие ответы, однако я думаю, что это может помочь узнать, что мы можем достичь инверсии в самой строке, а затем разбить ее. Если массив не нужен, мы можем просто сохранить строку. Таким образом, мы используем меньше памяти, я думаю:
$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
Это может обрабатывать переменную длину строк