Что такое код array_reverse

array_reverse

array_reverse — Возвращает массив с элементами в обратном порядке

Описание

Принимает массив array и возвращает новый массив, содержащем элементы исходного массива в обратном порядке.

Список параметров

Если установлено в TRUE, то ключи будут сохранены.

Возвращаемые значения

Возвращает массив с элементами в обратном порядке.

Список изменений

Версия Описание
4.0.3 Добавлен параметр preserve_keys.

Примеры

Пример #1 Пример использования array_reverse()

Оба массива $result и $result_keyed содержат одинаковые значения, но обратите внимание на различные ключи. Распечатка $result и $result_keyed будет такой:

Смотрите также

  • array_flip() — Меняет местами ключи с их значениями в массиве

array_reverse

array_reverse — возвращает массив с элементами, развёрнутыми в обратном порядке.

Описание

array array_reverse (array array [, bool preserve_keys])

array_reverse() принимает массив array и возвращает новый массив с элементами в перевёрнутом порядке, сохраняя ключи, если preserve_keys имеет значение TRUE.

Пример 1. array_reverse()

Переменные $result и $result_keyed содержать теперь один и тот же элемент, но отметьте разницу между ключами. Вывод $result и $result_keyed:

Примечание: второй параметр был введён в РНР 4.0.3.

Обратный массив без использования Array.Reverse()

5 Romil N [2011-05-22 16:40:00]

Как изменить массив (на С#) без использования метода Array.Reverse() ?

должно привести к

Я получил это как интервью.

arrays c# reverse

16 ответов

26 Решение Petar Minchev [2011-05-22 16:46:00]

Вместо слова // some code here в вопросе стоит заменить следующий код:

Вы должны выполнять итерацию только через первую половину массива ( arr.Length / 2 ). Если вы выполните итерацию по всему массиву ( arr.Length ), он будет дважды изменен, что даст тот же порядок элементов, что и до его начала.

1 Hot Licks [2011-05-22 16:50:00]

Ну, очевидно, вы можете просто скопировать в новый массив в обратном порядке.

Чтобы выполнить операцию «на месте», вы можете работать с обоих концов по направлению к середине: загрузите первый и последний элементы, затем сохраните их, первый в последнее место и последний в первое место. Затем выполните второй и следующий-последний и т.д. Если у вас есть четное число элементов, вы выполняете N/2 итерации. Если вы выполняете нечетное число (N-1)/2 итерации и оставляете средний элемент там, где он был.

Возможно, существуют и другие алгоритмы, которые будут немного быстрее при рассмотрении размера строки кеша и других характеристик памяти, но они не стоили бы этого, если бы вы не были в действительно критичной для производительности ситуации.

Вы можете сделать это разными способами: от самого быстрого до самого глупого:

Но я не могу понять, почему вы преследуете такой бесполезный квест, если это что-то произвело на кого-то кого-то, а затем использовать вместо циклов for:)

1 Kon [2011-05-22 16:45:00]

0 Max [2020-11-11 05:38:00]

//без использования метода обратного и без использования дополнительного массива // Попробуйте выполнить оператор, начиная с последнего элемента

0 Palec [2020-03-29 19:03:00]

В принципе, вас попросят переопределить Array.Reverse(Array) . Если вы посмотрите, как реализован в самой структуре и игнорирует многие технические детали, вы обнаружите, что он просто вызывает трехпараметрическую версию (который меняет указанную часть массива) на весь массив.

Array.Reverse(Array,Int32,Int32) — это цикл while, который свопирует элементы и поддерживает два индекса:

  • i указывает на первый элемент обращенной части и
  • j указывает на последний элемент обращенной части.

Переписано вместо // some code here вместо вопроса :

Это легче понять, чем реализация с использованием for-loop, делает меньше арифметических и элегантно уклоняется от gotcha с двойной реверсией.

Правая Скобка ]

Энциклопедия веб разработчика. Все что интересно HTML, CSS, PHP, MySQL и не только !

PHP функция array_reverse()

Синтаксис

Определение и использование
Функция меняет порядок всех элементов массива.
Параметры

Описание параметров
1 array (обязательно)
Задает массив.
2 preserve_keys (опционный)
Указывает, должен ли порядок ключей также быть изменен или нет. По умолчанию его значение FALSE.

Значение
Возвращает массив с элементами в обратном порядке.
Пример:

В результате будет получено:

Основные разделы

В подробностях о…

Правая Скобка ] © 2020. All Rights Reserved.

О разворачивании строк в .Net/C# и не только

Давайте поговорим о строках, точнее об их переворачивании средствами .Net/C#. Так уж сложилось, что в стандартной библиотеке соответсвующей функции не наблюдается. И как мне подсказывают, написание функции обращения строки довольно популярный вопрос на собеседованиях при приеме на работу. Давайте посмотрим, как можно эффективно перевернуть строку средствами данной платформы.

Под катом приведен сравнительный анализ быстродействия разных методов переворачивания строки.

Кхрр-р-р… — сказала бензопила.
Тююю… — сказали мужики.
© Старый анекдот.

Ну что ж, начнем. Все реализации проверялись на быстродействие с одной строкой размером 256 мегабайт (128×1024×1024 символа) и 1024×1024 строками размером 256 байт (128 символов). Перед каждым замером форсировалась сборка мусора (что важно при таком размере тестовых данных), замер проводился 50 раз, 20 крайних отбрасывались, остальные значения усреднялись. Условными попугаями было выбрано количество тиков, выдаваемое объектом класса Stopwatch.

Тест проводился на двух компьютерах: Athlon64 x2 4200+, 2GB Dual-Channel DDR2 RAM и Pentium4 HT 3GHz, 3GB DDR RAM. Главным отличием между конфигурациями в данном тесте является быстродействие связки память-кэш — вторая система в этом отношении заметно медленнее.

С техническими формальностями покончено, теперь перейдем к собственно реализациям. Для большей наглядности, здесь не учтены unicode surrogate code points. Рассматривать подходы будем в порядке логичности и «красивости» реализации в контексте окружающей ее «экосистемы».

Сравнительные результаты замеров находятся в последней части этой заметки. Оптимальной в общем случае оказалась функция ReverseUnsafeCopy, если же ограничиваться только safe code — ReverseArrayManual. Если необходим safe code и огромные строки — прийдется мучаться с ReverseStringBuilder.

Часть первая: «нормальные» методы.

1. ReverseStringBuilder

Будем следовать рекомендациям и для построения «большой» строки возьмем специальный инструмент — класс StringBuilder. Идея проста до ужаса: создаем builder нужного размера и идем по строке в обратном порядке, добавляя символы в новую строку.

Copy Source | Copy HTML

  1. static string ReverseStringBuilder( string str)
  2. <
  3. StringBuilder sb = new StringBuilder (str.Length);
  4. for ( int i = str.Length; i— != 0 ; )
  5. sb.Append(str[i]);
  6. return sb.ToString();
  7. >

Пробуем, запускаем, да… Как-то медленно работает это все, будем копать дальше.

2. ReverseArrayFramework

Ха! Так этот билдер же обставлен проверками для обеспечения потокобезопасности со всех сторон, не, нам такое не надо. Но строка — это ведь массив сиволов. Так давайте его и перевернем, а результат преобразуем обратно в строку:

Copy Source | Copy HTML

  1. static string ReverseArrayFramework( string str)
  2. <
  3. char [] arr = str.ToCharArray();
  4. Array .Reverse(arr);
  5. return new String (arr);
  6. >

Совсем другое дело, получилось в 3.5 раза быстрее. Хм, а может можно еще лучше?

3. ReverseArrayManual

Так, думаем. Во-первых у нас данные копируются дважы: сначала из строки в массив, потом внутри массива. Во-вторых Array.Reverse — библиотечный метод, значит в нем есть проверки входных данных. Более того, для атомарных типов он явно реализован в виде native метода, а это дополнительное переключение контекста выполнения. Попробуем перевернуть строку в массив вручную:

Copy Source | Copy HTML

  1. static string ReverseArrayManual( string originalString)
  2. <
  3. char [] reversedCharArray = new char [originalString.Length];
  4. for ( int i = originalString.Length — 1 ; i > — 1 ; i—)
  5. reversedCharArray[originalString.Length — i — 1 ] = originalString[i];
  6. return new string (reversedCharArray);
  7. >
4. ReverseManualHalf

Идем дальше. У нас же действия симметричны относительно середины строки, значит можно пустить два индекса навстречу и ученьшить количество итераций вдвое:

Copy Source | Copy HTML

  1. static string ReverseManualHalf( string originalString)
  2. <
  3. char [] reversedCharArray = new char [originalString.Length];
  4. int i = 0 ;
  5. int j = originalString.Length — 1 ;
  6. while (i return new string (reversedCharArray);
  7. >

Хм… Что-то пошло не так, на системе с медленной памятью скорость упала в полтора раза. Учитывая специфику конфигураций и реализации, можем предположить, что виноваты скорость памяти и кэш процессора: раньше мы работали с двумя отдаленными областями памяти одновременно, теперь их стало четыре, соответсвенно подхват данных выполняется чаще.

LINQ и метод Reverse

Есть еще относительно красивый и короткий способ с LINQ, но он не выдерживает никакой критики в плане производительности — работает в 3-3.5 раза медленнее метода на базе StringBuilder. Виной тому прокачивание данных через IEnumerable и виртуальный вызов на каждую итерацию. Для желающих, ниже приведена реализация:

Copy Source | Copy HTML

  1. static string ReverseStringLinq( string originalString)
  2. <
  3. return new string (originalString.Reverse().ToArray());
  4. >
Использование памяти

Проблема не столь критичная в большинстве случаев, но все «быстрые» из рассмотренных методов делают промежуточную копию строки в виде массива символов. На синтетических тестах это проявляется в том, что обернуть строку размером 512МБ смог только первый метод, остальные свалились по System.OutOfMemoryException. Также, не следует забывать, что лишние временные объекты повышают частоту срабатывания GC, а он хоть и оптимизирован до ужаса, но все-равно время кушает. В следующей части будем кроме скоростных оптимизаций также искать решение этой проблемы.

Часть вторая: когда хочется быстрее и эффективнее, или unsafe code.

Использование unsafe кода дает нам одно интересное преимущество: строки, которые раньше были immutable, теперь можно менять, но нужно быть предельно осторожным и изменять только копии строк — библиотека минимизирует количество копий одной строки, а вместе с интернированием строк это может привести к печальным последствиями для приложения.

Итак, создав новую строку нужного размера, мы можем смотреть на нее, как на массив и заполнить нужными данными. Ну и не стоит забывать об отстутствии проверок на валидность индексов, что тоже ускорит работу кода. Однако в силу специфики строк в .Net, мы не можем вот так просто создать строку нужной длины. Можно либо сделать строку из повторяющегося символа (например проблела) при помощи конструктора String(char, int), либо скопировать исходную строку используя String.Copy(String).

Вооружившись этими знаниями пишем следующие две реализации.

5. ReverseUnsafeFill

Делаем строку из пробелов и заполняем ее в обратном порядке:

Copy Source | Copy HTML

  1. static unsafe string ReverseUnsafeFill( string str)
  2. <
  3. if (str.Length 1 ) return str;
  4. String copy = new String ( ‘ ‘ , str.Length);
  5. fixed ( char * buf_copy = copy)
  6. <
  7. fixed ( char * buf = str)
  8. <
  9. int i = 0 ;
  10. int j = str.Length — 1 ;
  11. while (i return copy;
  12. >
6. ReverseUnsafeCopy

Копируем и переворачиваем строку:

Copy Source | Copy HTML

  1. static unsafe string ReverseUnsafeCopy( string str)
  2. <
  3. if (str.Length 1 ) return str;
  4. char tmp;
  5. String copy = String .Copy(str);
  6. fixed ( char * buf = copy)
  7. <
  8. char * p = buf;
  9. char * q = buf + str.Length — 1 ;
  10. while (p return copy;
  11. >

Как показали замеры, вторая версия работает заметно быстрее на медленной памяти и слегка медленнее на быстрой :) Причин видимо несколько: оперирование двумя отдаленными областями памяти вместо четырех и различие в скорости копирования блока памяти и простого его заполнения в цикле. Желающие могут попробовать сделать версию ReverseUnsafeFill с полным проходом (это может уменьшить число захватов данных из памяти в кэш) и испытать ее на медленной памяти, однако у меня есть основания считать, что это будет все-равно медленнее ReverseUnsafeCopy (хотя могу и ошибаться).

7. ReverseUnsafeXorCopy

А что дальше? Ходят слухи, что обмен при помощи оператора XOR работает быстрее копирования через третью переменную (кстати в плюсах это еще и смотрится довольно красиво: «a ^= b ^= a ^= b;», в C#, увы, такая строка не cработает). Ну что, давайте проверим на деле.

Copy Source | Copy HTML

  1. static unsafe string ReverseUnsafeXorCopy( string str)
  2. <
  3. if (str.Length 1 ) return str;
  4. String copy = String .Copy(str);
  5. fixed ( char * buf = copy)
  6. <
  7. char * p = buf;
  8. char * q = buf + str.Length — 1 ;
  9. while (p return copy;
  10. >

В итоге получается в 1.2-1.5 раза медленнее обмена копированием. Трюк, работавший для быстрого обмена значений на регистрах, для переменных себя не оправдал (что характено, во многих компиляторах С/С++ он тоже выиграша не дает).

В поисках объяснения этого факта полезем внутрь приложения и почитаем результирующий CIL код.

Часть третья: лезем в CIL и коды библиотек .Net.

Почему обмен через XOR оказался хуже

Для получения ответа на этот вопрос стоит посмотреть на CIL-код, сгенерированный для двух способов обмена. Чтоб эти инструкции казались понятнее, поясню их назначение: ldloc.N — загружает на стек локальную переменную под номером N, stloc.N — считывает верхушку стека в локальную переменную номер N, xor — вычисляет значение операции XOR для двух значений наверху стека и загружает результат на стек вместо них.

Есть ли функция реверса одномерного массива?

10.12.2010, 21:22

Функция: вернуть среднее значение элементов одномерного массива
Составьте функцию, которая вернет среднее значение элементов одномерного массива. Составьте.

Рекурсивная функция нахождения максимального элемента одномерного массива
Помогите пожалуйста. Что я делаю не так? Мне нужно написать рекурсивную функцию нахождения.

Функция формирования элементов одномерного массива с помощью генератора случайных чисел
2. Описать функции формирования элементов одномерного массива с помощью генератора случайных чисел.

Функция реверса строки
На собеседовании в одну компанию меня попросили на бумажке написать функцию реверса строки. .

Функция, которая удаляет из целочисленного одномерного массива все, и возвращает новый размер массива
Разработать и испытать функцию, которая удаляет из целочисленного одномерного массива все, и.

Что такое код array_reverse

array_reverse — Возвращает массив с элементами в обратном порядке

Описание array array_reverse ( array array [, bool preserve_keys] )

Функция array_reverse() берёт массив array и возвращает новый массив, порядок элементов в котором обратный исходному, сохраняя ключи, если параметр preserve_keys равен TRUE .

Пример 1. Пример использования array_reverse()

= array( «php» , 4.0 , array( «green» , «red» ));
$result = array_reverse ( $input );
$result_keyed = array_reverse ( $input , true );
?>

Оба массива $result и $result_keyed содержат одинаковые значения, но обратите внимание на различные ключи. Распечатка $result и $result_keyed будет:

[1] => 4
[0] => php
)

Замечание: Второй аргумент был добавлен в PHP 4.0.3.

Пред. Начало След.
array_reduce Уровень выше array_search

Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:

PHP для профессионалов Электронный учебник

Учебник РНР
Назад Вперёд

array_reverse — возвращает массив с элементами, развёрнутыми в обратном порядке.

Описание

array array_reverse (array array [, bool preserve_keys])

array_reverse() принимает массив array и возвращает новый массив с элементами в перевёрнутом порядке, сохраняя ключи, если preserve_keys имеет значение TRUE .

Пример 1. array_reverse()

Переменные $result и $result_keyed содержать теперь один и тот же элемент, но отметьте разницу между ключами. Вывод $result и $result_keyed :

Примечание: второй параметр был введён в РНР 4.0.3.


Назад Оглавление Вперёд
array_reduce Вверх array_search

[an error occurred while processing this directive]

Array_reverse

Php функции


Php скрипты


array_reverse

array_reverse — Возвращает массив с элементами в обратном порядке

Описание

array array_reverse ( array array [ , bool preserve_keys ] )

Функция array_reverse() берёт массив array и возвращает новый массив, порядок элементов в котором обратный исходному, сохраняя ключи, если параметр preserve_keys равен TRUE.

Пример 1. Пример использования array_reverse()

$i nput = array ( «php» , 4.0 , array ( «green» , «red» ));
$r esult = array_reverse ( $i nput );
$r esult _keyed = array_reverse ( $i nput , true );
?>

Оба массива $r esult и $r esult _keyed содержат одинаковые значения, но обратите внимание на различные ключи. Распечатка $r esult и $r esult _keyed будет:

Array
(
[ 0 ] => Array
(
[ 0 ] => green
[ 1 ] => red
)

[ 1 ] => 4
[ 0 ] => php
)

Замечание: Второй аргумент был добавлен в PHP 4.0.3.

User Contributed Notes

me2resh at gmail dot com
04-Feb-2005 12:25

Here is my version of sorting mult >if u want it alphapatically sorted by any key.

u can remove the strtolower part if you want to keep it case sensitive

function cmp( $a , $b ) <
return strcmp (strtolower( $a [ «name» ] ), strtolower ( $b [ «name» ] ));
>
Michiel de Roo
08-Sep-2003 11:55

If you need to reverse an array by reference, you can use the following all.php?act=funct&argument=

function & array_reverse_ref (& $a ) <
$r = array ();
for ( $i = 0 , $j = count ( $a ); $i count ( $a ); $i ++, $j —) <
$r [ $i ] =& $a [ $j — 1 ] ;
>
return $r ;
>
?>

Use it like:

class t <
var $message = «message» ;
>
for ( $i = 0 ; $i $i ++) <
$a [ ] = new t ();
>

$a [ 0 ] -> message = «now. this works in both» ;
$r a [ 0 ] -> message = «but. does not work in both» ;

for ( $i = 0 ; $i $i ++) <
echo $r a [ $i ] -> message ; echo «
\n» ;
>
echo «
\n» ;
for ( $i = 0 ; $i $i ++) <
echo $a [ $i ] -> message ; echo «
\n» ;
>
?>

zee4speed at hotmail dot com
04-Jul-2003 09:56

another way to ->
If you want to reverse an array with numerical indexes, you can keep them by using following code:

# this is your array , and you would like to reverse it however maintain their actual index values to point to the existings.
$a rr ay _to_reverse [ 0 ] = «zee» ;
$a rr ay _to_reverse [ 1 ] = «andrew» ;
$a rr ay _to_reverse [ 2 ] = «pablo» ;
$a rr ay _to_reverse [ 3 ] = «mike» ;
$a rr ay _to_reverse [ 4 ] = «ahmed» ;
$a rr ay _to_reverse [ 5 ] = «yousra» ;
$a rr ay _to_reverse [ 6 ] = «samir» ;
# you want the array to look like this so you can use a command like for each to march through the array.
$a rr ay _reversed [ 6 ] = «samir» ;
$a rr ay _reversed [ 5 ] = «yousra» ;
$a rr ay _reversed [ 4 ] = «ahmed» ;
$a rr ay _reversed [ 3 ] = «mike» ;
$a rr ay _reversed [ 2 ] = «pablo» ;
$a rr ay _reversed [ 1 ] = «andrew» ;
$a rr ay _reversed [ 0 ] = «zee» ;
# however if you use array_reverse you get this:
$a rr ay _reversed [ 0 ] = «samir» ;
$a rr ay _reversed [ 1 ] = «yousra» ;
$a rr ay _reversed [ 2 ] = «ahmed» ;
$a rr ay _reversed [ 3 ] = «mike» ;
$a rr ay _reversed [ 4 ] = «pablo» ;
$a rr ay _reversed [ 5 ] = «andrew» ;
$a rr ay _reversed [ 6 ] = «zee» ;
# this causes element samir to be first instead of last, just like you want. hoever, the index value that refferences samir is now 0 instead of 6
# solution to this is the following code

$a rr ay _reversed = array_reverse ( $a rr ay _to_reverse );
$size_of_array = count ( $a rr ay _reversed );
for ( $z = 0 ; $z $size_of_array ; $z ++) <
#do what you want
# if you want to get the index value of the un-reveresed array , simply
$a ctual_index = GetActualIndex ( $z , $size_of_array );
echo $z . » on array_reversed is the same » . $a ctual_index . » on array_to_reverse
\n» ;
>

function GetActualIndex ( $current_index , $size_of_array ) <
$r everse_location = abs ( $current_index + 1 — $size_of_array );
return $r everse_location ;
>
?>

m dot weber at luna-park dot de
31-Jan-2003 06:02

If you want to reverse an array with numerical indexes, you can keep them by using following code:

end ( $gruppenarr );
do <
$part1 = key ( $gruppenarr );
$part2 = current ( $gruppenarr );
$gruppenarr 2 [ $part1 ] = $part2 ;
> while ( prev ( $gruppenarr ));
?>

input is $gruppenarr
output is $gruppenarr 2
nospam dot nass at btinternet dot com dot nospam
13-Jun-2001 05:08

For a similar functionality in PHP3, use something like:

for ( $i = count ( $foo ) — 1 ; $i >= 0; $i — ) <

do something here

. where $foo is the array that you want to reverse.
rahulavhad at yahoo dot com
30-Dec-2000 07:31

This code can help in recursive reversing of the array.

$a rr 1 = array ( 2 , 1 , array ( 5 , 2 , 1 , array ( 9 , 8 , 7 )), 5 , 0 );
$a rr 1 = array_reverse ( $a rr 1 );

function Reverse_Array ( $a rr ay )
< $i ndex = 0 ;
foreach ( $a rr ay as $subarray )
< if ( is_array ( $subarray ))
< $subarray = array_reverse ( $subarray );
$a rr = Reverse_Array ( $subarray );
$a rr ay [ $i ndex ] = $a rr ;
>
else < $a rr ay [ $i ndex ] = $subarray ; >
$i ndex ++;
>
return $a rr ay ;
>

$a rr 2 = Reverse_Array ( $a rr 1 );
?>

david at audiogalaxy dot com
04-Mar-2000 12:39

As a further clarification: key-value pairs have an order within an array completely separate from whatever the keys happen to be — the order in which you add them. This is the order that functions like each () and next () will move their pointer through the array.
If you add to an array without specifying the key, like $a rr ay [ ] = value; then an internal counter supplies the key value and then the numerical order of your keys will be > If you «leave holes» — jumping ahead by specifying a higher number for the key, like $a rr ay [ 1000 ] = value; the internal counter gets pushed forward appropriately. Other than its effect on this internal counter, specifying a numerical key seems no different than specifying a string.
However, some array functions, like array_merge () and array_reverse () treat keys that are numbers differently from keys that are not.
david at audiogalaxy dot com
04-Mar-2000 11:40

Что такое код array_reverse

array_reverse — возвращает массив с элементами, развёрнутыми в обратном порядке.

Описание

array array_reverse (array array [, bool preserve_keys])

array_reverse() принимает массив array и возвращает новый массив с элементами в перевёрнутом порядке, сохраняя ключи, если preserve_keys имеет значение TRUE .

Пример 1. array_reverse()

Переменные $result и $result_keyed содержать теперь один и тот же элемент, но отметьте разницу между ключами. Вывод $result и $result_keyed :

Примечание: второй параметр был введён в РНР 4.0.3.

Илон Маск рекомендует:  Что такое код pdf_get_fontsize
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL