Понимание массивов в php

Соединение массивов

Можно также объединить несколько массивов в один массив большего размера. Для этого также используется Array.Copy метод.

Примечание

В этом разделе не обсуждается объединение массива строк в одну строку. Сведения о присоединении массива строк см. в описании String.Join метода.

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

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

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

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

Многомерный массив PHP

Многомерный массив PHP может содержать массивы внутри себя, а подмассивы могут включать в себя другие массивы.

Используем пример из реальной жизни. У Дэвида есть два сына — Ричи и Мейсон. У Ричи есть две дочери — Сью и Наташа, в то время как у Мейсона три дочери — Николь, Сальма и Эмбер. Их семейное древо выглядит следующим образом:

Если мы хотим отобразить семейное древо Дэвида используя многомерный массив PHP, то можем определить массив следующим образом:

$david = array
(
“richie”=>array
(
“Sue”,
“Natasha”
),
“Mason”=>array
(
“Nichole”,
“Salma”,
“Amber”
)
);

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

Добавление/удаление элементов

Мы уже знаем методы, которые добавляют и удаляют элементы из начала или конца:

  • – добавляет элементы в конец,
  • – извлекает элемент из конца,
  • – извлекает элемент из начала,
  • – добавляет элементы в начало.

Есть и другие.

Как удалить элемент из массива?

Так как массивы – это объекты, то можно попробовать :

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

Это нормально, потому что всё, что делает – это удаляет значение с данным ключом . Это нормально для объектов, но для массивов мы обычно хотим, чтобы оставшиеся элементы сдвинулись и заняли освободившееся место. Мы ждём, что массив станет короче.

Поэтому для этого нужно использовать специальные методы.

Метод arr.splice(str) – это универсальный «швейцарский нож» для работы с массивами. Умеет всё: добавлять, удалять и заменять элементы.

Его синтаксис:

Он начинает с позиции , удаляет элементов и вставляет на их место. Возвращает массив из удалённых элементов.

Этот метод проще всего понять, рассмотрев примеры.

Начнём с удаления:

Легко, правда? Начиная с позиции , он убрал элемент.

В следующем примере мы удалим 3 элемента и заменим их двумя другими.

Здесь видно, что возвращает массив из удалённых элементов:

Метод также может вставлять элементы без удаления, для этого достаточно установить в :

Отрицательные индексы разрешены

В этом и в других методах массива допускается использование отрицательного индекса. Он позволяет начать отсчёт элементов с конца, как тут:

Метод arr.slice намного проще, чем похожий на него .

Его синтаксис:

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

Это похоже на строковый метод , но вместо подстрок возвращает подмассивы.

Например:

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

Метод arr.concat создаёт новый массив, в который копирует данные из других массивов и дополнительные значения.

Его синтаксис:

Он принимает любое количество аргументов, которые могут быть как массивами, так и простыми значениями.

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

Если аргумент – массив, то все его элементы копируются. Иначе скопируется сам аргумент.

Например:

Обычно он просто копирует элементы из массивов. Другие объекты, даже если они выглядят как массивы, добавляются как есть:

…Но если объект имеет специальное свойство , то он обрабатывается как массив: вместо него добавляются его числовые свойства.

Для корректной обработки в объекте должны быть числовые свойства и :

ReDim с Preserve

Если мы используем ReDim для существующего массива, то массив и его содержимое будут удалены.

В следующем примере второй оператор ReDim создаст совершенно новый массив. Исходный массив и его содержимое будут удалены.

Sub UsingRedim()

    Dim arr() As String
    
    ' Установить массив в слоты от 0 до 2
    ReDim arr(0 To 2)
    arr(0) = "Яблоко"
    
    ' Массив с яблоком теперь удален
    ReDim arr(0 To 3)

End Sub

Если мы хотим расширить размер массива без потери содержимого, мы можем использовать ключевое слово Preserve.

Когда мы используем Redim Preserve, новый массив должен начинаться с того же начального размера, например мы не можем сохранить от (0 до 2) до (от 1 до 3) или до (от 2 до 10), поскольку они являются различными начальными размерами.

В следующем коде мы создаем массив с использованием ReDim, а затем заполняем массив типами фруктов.

Затем мы используем Preserve для увеличения размера массива, чтобы не потерять оригинальное содержимое.

Sub UsingRedimPreserve()

    Dim arr() As String
    
    ' Установить массив в слоты от 0 до 1
    ReDim arr(0 To 2)
    arr(0) = "Яблоко"
    arr(1) = "Апельсин"
    arr(2) = "Груша"
    
    ' Изменение размера и сохранение исходного содержимого
    ReDim Preserve arr(0 To 5)

End Sub

Из приведенных ниже снимков экрана видно, что исходное содержимое массива было «сохранено».

Предостережение: в большинстве случаев вам не нужно изменять размер массива, как мы делали в этом разделе. Если вы изменяете размер массива несколько раз, то вам захочется рассмотреть возможность использования коллекции.

Использование Preserve с 2-мерными массивами

Preserve работает только с верхней границей массива.

Например, если у вас есть двумерный массив, вы можете сохранить только второе измерение, как показано в следующем примере:

Sub Preserve2D()

    Dim arr() As Long
    
    ' Установите начальный размер
    ReDim arr(1 To 2, 1 To 5)
    
    ' Изменить размер верхнего измерения
    ReDim Preserve arr(1 To 2, 1 To 10)

End Sub

Если мы попытаемся использовать Preserve на нижней границе, мы получим ошибку «Индекс вне диапазона».

В следующем коде мы используем Preserve для первого измерения. Запуск этого кода приведет к ошибке «Индекс вне диапазона»:

Sub Preserve2DError()

    Dim arr() As Long
    
    ' Установите начальный размер
    ReDim arr(1 To 2, 1 To 5)
    
    ' Ошибка «Вне диапазона»
    ReDim Preserve arr(1 To 5, 1 To 5)

End Sub

Когда мы читаем из диапазона в массив, он автоматически создает двумерный массив, даже если у нас есть только один столбец.

Применяются те же правила сохранения. Мы можем использовать Preserve только на верхней границе, как показано в следующем примере:

Sub Preserve2DRange()

    Dim arr As Variant
    
    ' Назначить диапазон массиву
    arr = Sheet1.Range("A1:A5").Value
    
    ' Preserve будет работать только на верхней границе
    ReDim Preserve arr(1 To 5, 1 To 7)

End Sub

Основы

Давайте начнём с простой функции, которая оперирует ключами и значениями элементов массивов. Одной из таких функций является array_combine(), которая создаёт новый массив из двух существующих: первый использует для создания ключей, второй в качестве значений:

$keys = ;
$values = ;

$array = array_combine($keys, $values);
print_r($array);

// Array
// (
// 	 => blue
// 	 => green
// 	 => orange
// )

В этом же разрезе вам могут пригодиться функции array_values(). Она извлекает из ассоциативного массива значения; array_keys() возвращает только ключи заданного массива; array_flip() меняет местами ключи и значения:

print_r(array_keys($array)); // 
print_r(array_values($array)); // 
print_r(array_flip($array));

// Array
// (
// 	 => sky
// 	 => grass
// 	 => orange
// )

Перебор элементов массива без использования циклов

Можно осуществлять перебор элементов массива и без использования циклов. Для этого мы будем использовать специальную функцию array_walk().

Эта функция работает следующим образом: она позволяет последовательно применять ко всем элементам массива отдельно созданную функцию. То есть сначала мы создаем самостоятельную функцию, а потом при помощи array_walk() применяем ее к каждому элементу массива. Причем в самостоятельно созданной функции мы можем прописать любое нужное нам действие над элементом массива.

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

<?php
function f_print($value, $key)
{
echo $key . '=&gt;' . $value . '<br>';		
}
$Mass = 5;
$Mass = 10;
$Mass = 15;
array_walk($Mass, "f_print");
?>

В итоге на экране мы увидим следующее.

Вот, пожалуй, и все, что я хотела Вам рассказать о переборе элементов массива.

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

В следующей статье мы поговорим о добавлении и удалении элементов массива в разные его места.

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

С Вами была Анна Котельникова. Успехов и до новых встреч!

PHP. Как удалить элемент из массива

Если вы хотите удалить элемент массива, то вы можете использовать unset() или array_splice().

Также, если у вас есть значение и вы не знаете ключ для удаления элемента, вы можете использовать, array_search() чтобы получить ключ.

Как в PHP удалить элемент массива при помощи unset()

Обратите внимание, что при использовании unset() ключи массива не будут изменяться / переиндексироваться. Если вы хотите переиндексировать ключи, то используйте array_values() после unset(), что приведет к тому, что все ключи будут пронумерованы начиная с 0

При помощи array_splice()

Если вы используете array_splice(), то они будут автоматически переиндексированы, но ассоциативные ключи не изменятся, в отличие от array_values(), где все ключи будут преобразованы в цифровые.

Также в array_splice() необходимо указать смещение, а не ключ!

Удалить несколько элементов массива

Если вы хотите удалить несколько элементов массива и не хотите вызывать unset() или array_splice() несколько раз, вы можете использовать функции array_diff() или в array_diff_key() зависимости от того, знаете ли вы значения или ключи элементов, которые вы хотите удалить.

При помощи array_diff()

Если вам известны значения элементов массива, которые вы хотите удалить, то вы можете их использовать array_diff(). Как и раньше, unset() не будет изменять / переиндексировать ключи массива.

При помощи array_diff_key()

Если вы знаете ключи элементов, которые вы хотите удалить, то вы можете использовать array_diff_key().

Здесь вы должны убедиться, что вы передаете ключи как ключи во втором параметре, а не как значения. В противном случае вы должны перевернуть массив при помощи array_flip(). Тогда ключи не будут меняться /переиндексироваться.

Если вы хотите использовать unset() или array_splice() чтобы удалить несколько элементов с одинаковым значением, то вы можете использовать, array_keys() чтобы получить все ключи для определенного значения, а затем удалить все элементы.

Erase

Функция Erase используется для сброса значений массивов фиксированного размера и освобождения памяти динамических массивов.Он ведет себя в зависимости от типа массивов.

Синтаксис

  • Фиксированный числовой массив, каждый элемент в массиве сбрасывается до нуля.
  • Исправлен строковый массив, каждый элемент в массиве сбрасывается до нулевой длины «».
  • Массив объектов, каждый элемент в массиве сбрасывается до специального значения .

пример

Добавьте кнопку и добавьте следующую функцию.

Private Sub Constant_demo_Click()
   Dim NumArray(3)
   NumArray(0) = "VBScript"
   NumArray(1) = 1.05
   NumArray(2) = 25
   NumArray(3) = #23/04/2013#
  
   Dim DynamicArray()
   ReDim DynamicArray(9)   ' Allocate storage space.
  
   Erase NumArray          ' Each element is reinitialized.
   Erase DynamicArray      ' Free memory used by array.
  
   ' All values would be erased.
   msgbox("The value at Zeroth index of NumArray is " & NumArray(0))
   msgbox("The value at First index of NumArray is " & NumArray(1))
   msgbox("The value at Second index of NumArray is " & NumArray(2))
   msgbox("The value at Third index of NumArray is " & NumArray(3))
End Sub

Когда вы выполняете вышеуказанную функцию, она производит следующий вывод.

Функция, которая восстанавливает выделенную память для переменных массива.

Предыдущие статьи

  • Функции даты-времени в VBA. Работа с датой и временем — 25/03/2018 17:33
  • Работа со строками в VBA: InStr, LCASE, UCase, Left, Right, Mid, LTrim, RTrim, Trim, Len, Replace, Space, StrComp, String, StrReverse — 25/03/2018 15:57
  • Работа с циклами в VBA:loop, for each, for next — 17/03/2018 18:40
  • Решения, условия, алгоритмы if, then, switch в VBA Excel — 10/03/2018 21:52
  • Константы в VBA Excel — Const. Как присвоить значение константам — 10/03/2018 07:53
  • Поле ввода в VBA Excel — InputBox. Синтаксис, параметры и описание — 10/03/2018 07:03
  • Окно сообщения в VBA Excel — MsgBox — 09/03/2018 06:34
  • Простые Макросы Excel, написать шаг за шагом — 10/02/2018 20:07
  • Переменные в VBA, значения и типы — 26/06/2017 06:37
  • Программирование vba, макросы в Word и Excel — 19/12/2015 16:18

Двухмерные массивы

Ранее мы рассматривали только одномерные массивы, но они могут иметь и больше измерений. Они могут быть
двухмерные, трёхмерные, четырёхменрые и так далее. Если одномерный массив можно
представить в виде строки, то двухмерный — это страница, состоящая из нескольких строк. Также двухмерный
массив можно представить в виде таблицы, в которой есть строки, а в каждой строке есть ячейки. Каждый
элемент в таком массиве имеет два индекса — индекс первого измерения и второго измерения. Эти индексы можно
сравнить с номером строки и номером символа в строке. В коде программы каждый индекс пишется в квадратных
скобках. Пример:

333435363738
$dimens=30;
$dimens=5;
$dimens=10;
$dimens=55;
echo '<br>';
print_r($dimens);

Многомерные массивы бывают не только индексированные, но и ассоциативные.

Заполнение массива данными

Заполнить пустой массив данными можно следующими способами:

  • В тексте программы присвоить ячейкам числа.
  • Организовать ввод с клавиатуры.
  • Воспользоваться процедурой генерации случайных чисел.

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

Заполнение массива Mass (10) случайными числами можно программное реализовать так:

program Massiv ; var i: integer; Mass: array of integer;

randomize;

begin for i:=1 to 10 do Mass :=random(100);

end.

Чтобы увидеть на экране сгенерированный массив, можно дополнительно в основную часть программы добавить процедуру вывода элементов массива на экран:

for i:=1 to 10 do write (Mass ,` `);

Как видно из примера, для организации перебора индексов массива, используется циклическая конструкция оператора повтора с заданным числом повторений FOR .. TO.. DO.

Примеры создания и использования массива

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

Массив $aFruits создается обычным образом: перечисляются значения, индексы назначаются автоматически с нуля. Последняя запятая не имеет значения и не приводит к созданию еще одного пустого элемента.

Массив $aData создается пустым, потом в него вносятся значения. Три — автоматом, а два — с ассоциативными индексами, которые не влияют на общую нумерацию значений. Так, элементы «слива» и «персик» имеют индексы «новая» и «свежий» соответственно.

Массив $aInfo — многомерный и ассоциативный.

Как в PHP-массиве удалить элемент, показывают три операции удаления.

Первая операция удаляет второй элемент из массива $aFruits, у него индекс равен 1. Следует отметить, что следующие за ним индексы не сдвигаются, значит, в циклических операциях с таким массивом следует предусмотреть проверку существования элемента.

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

Третья — удаляет массив в массиве и элемент в массиве, входящий в другой массив.

Вернуть массив с помощью Std

C ++ использует множество методов для возврата массива из функции. Один из них — через std :: array. Это шаблон структуры. Эта функция также предоставляет еще две функции: size () и empty (). Возвращается имя массива, указывающее, что в основную программу возвращается весь массив. Здесь мы добавим заголовочный файл «array». Помимо библиотеки он содержит все функции массива.

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

И снова цикл for будет использоваться для отображения значений массива. Мы наблюдаем вывод из изображения, показанного ниже. Поскольку мы использовали 10 размеров, будет введено 0 чисел. Следовательно, они отображаются:

Объявление массивов

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

'Method 1 : Using Dim
Dim arr1()	'Without Size

'Method 2 : Mentioning the Size
Dim arr2(5)  'Declared with size of 5

'Method 3 : using 'Array' Parameter
Dim arr3
arr3 = Array("apple","Orange","Grapes")
  • Хотя размер массива указывается как 5, он может содержать 6 значений, поскольку индекс массива начинается с ZERO.
  • Индекс массива не может быть отрицательным.
  • Массивы VBScript могут хранить любой тип переменной в массиве. Следовательно, массив может хранить целое число, строку или символы в одной переменной массива.

Работа со значениями из массива

Всё, о чём было написано выше, это были как бы вспомогательные элементы программы. Далее разберём несколько примеров обработки массивов.

Поиск максимального/максимального значения в массиве

Ниже приведён полный код программы поиска минимального значения в массиве и его индекса. В программе используется глобальный автоматический массив. Значения массива получаются посредством генератора случайных чисел.

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

Как видно из комментариев, за поиск минимального значения и его индекса отвечает последний фрагмент программы.

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

Понятно, что поиск максимального значения производится полностью аналогично, с точностью до знаков «больше»/«меньше», вывода строки пользователю и наименования переменных.

Поиск определённого значения в массиве

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

Задачи на поиск в массиве могут быть в двух формах:

  1. найти первое (последнее) вхождение искомого значения
  2. найти все вхождения

Поиск первого вхождения:

Поиск последнего вхождения:

Обратите внимание на следующие моменты

  1. Переменная цикла описана перед циклом. Таким образом, эта переменная продолжает существовать после окончания цикла, и её значение может быть использовано.

  2. Если искомый элемент найден, то цикл завершается досрочно оператором : просматривать остальную часть массива не имеет смысла — задача уже выполнена.

  3. Во втором случае переменная имеет знаковый тип . Отрицательное значение используется в качестве флага, что весь массив просмотрен, и значение не найдено.

Поиск всех вхождений:

Здесь цикл не прерывается. Массив просматривается полностью.

Filter

Функция фильтра, которая возвращает массив на основе нуля, который содержит подмножество массива строк на основе определенных критериев фильтра.

СинтаксисПараметры и Описание

  • Inputstrings — обязательный параметр. Этот параметр соответствует массиву строк для поиска.
  • Значение — требуемый параметр. Этот параметр соответствует строке для поиска по параметру inputstrings.
  • Include — необязательный параметр. Это логическое значение, которое указывает, следует ли возвращать подстроки, которые включают или исключают.
  • Compare — Необязательный параметр. Этот параметр описывает, какой метод сравнения строк должен использоваться.
  • = vbBinaryCompare — выполняет двоичное сравнение
  • 1 = vbTextCompare — выполняет текстовое сравнение

пример

Добавьте кнопку и добавьте следующую функцию.

Private Sub Constant_demo_Click()
   Dim a,b,c,d as Variant
   a = array("Red","Blue","Yellow")
   b = Filter(a,"B")
   c = Filter(a,"e")
   d = Filter(a,"Y")
  
   For each x in b
      msgbox("The Filter result 1: " & x)
   Next
  
   For each y in c
      msgbox("The Filter result 2: " & y)
   Next
  
   For each z in d
      msgbox("The Filter result 3: " & z)
   Next
End Sub

Когда вы выполняете вышеуказанную функцию, она производит следующий вывод.p

Функция, которая возвращает массив с нулевым основанием, который содержит подмножество массива строк на основе определенных критериев фильтра.

Элементы массива в простом массиве

Давайте создадим массив с именем для хранения числа учащихся в каждом классе в школе. Индексы элементов находятся в диапазоне от 0 до 6. Использование этого массива проще, чем объявление семи переменных.

На следующем рисунке показан массив. Для каждого элемента массива:

  • индекс элемента представляет школьный класс (индекс 0 представляет детский сад);

  • значение, содержащееся в элементе, представляет число учеников в этом классе.

в следующем примере содержится код Visual Basic, который создает и использует массив:

В этом примере выполняется три вещи:

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

Массив в предыдущем примере является одномерным массивом, так как он использует один индекс. Массив, использующий более одного индекса или подстрочного, называется многомерным. Дополнительные сведения см. в остальной части этой статьи и в разделе измерения массива в Visual Basic.

Заключение

Ниже приводится краткое изложение основных моментов этой статьи.

  1. Массивы — это эффективный способ хранения списка элементов одного типа.
  2. Вы можете получить доступ к элементу массива напрямую, используя номер местоположения, который известен как индекс.
  3. Распространенная ошибка «Индекс вне диапазона» вызвана доступом к несуществующему местоположению.
  4. Существует два типа массивов: статический и динамический.
  5. Статический используется, когда размер массива всегда одинаков.
  6. Динамические массивы позволяют вам определять размер массива во время выполнения.
  7. LBound и UBound обеспечивают безопасный способ поиска самых маленьких и самых больших подписок массива.
  8. Основной массив является одномерным. Есть еще многомерные массивы.
  9. Чтобы только передать массив в процедуру, используйте ByRef. Вы делаете это так: ByRef arr() as long.
  10. Вы можете вернуть массив из функции, но массив, которому он назначен, не должен быть выделен в данный момент.
  11. Рабочий лист с его строками и столбцами по сути является двумерным массивом.
  12. Вы можете читать непосредственно из диапазона листа в двухмерный массив всего за одну строку кода.
  13. Вы также можете записать из двумерного массива в диапазон всего за одну строку кода.
Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: