Хелпер Arr

Комментарии: 6  Просмотры: 15 872

Несмотря на то, что функций для работы с массивами в php не много, а очень много, выполнить какую-то задачу, используя только одну стандартную функцию получается не всегда. И тогда на помощь приходят методы класса Arr, которых, кстати говоря, тоже немало. Давайте их рассмотрим.
Первый метод я уже упоминал в качестве примера в разделе Знакомимся с Хелперами. Но поскольку он самый частоиспользуемый, рассказываю еще раз:

$message = Arr::get($_GET, 'message', 'Нет сообщения');

В переменную $message попадет значение $_GET['message'], если оно существует. Если же его нет, то туда попадет значение третьего параметра, передаваемого в метод. Этот параметр не является обязательным и по умолчанию равен NULL.

Следующий метод делает аналогичную вещь, только на этот раз работает не с одним значением массива. Результатом также будет массив с ключами page и message:

$message = Arr::extract($_GET, array('page', 'message'), 'Не установлено');

Третий параметр здесь опять же необязателен.
Оба метода позволяют избежать ошибки, если массив или какие-то значения массива не определены, но мы пытаемся с ними работать.

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

$array1 = array('name' => 'Вася', 'surname' => 'Пупкин');
$array2 = array('name' => 'Иван', 'surname' => 'Иванов');
$array3 = array('name' => 'Петр', 'surname' => 'Петров');
$array_list = array($array1, $array2, $array3);
$names = Arr::pluck($array_list, 'name');

В данном случае мы получим массив с именами:

Array ( [0] => Вася [1] => Иван [2] => Петр )

Метод merge делает по сути тоже самое, что и стандартная функция для рекурсивного соединения массивов — array_merge_recursive, но не совсем. Приведу пример из комментария, он очень нагляден. У нас есть Джон и есть Мэри. Они решили пожениться. Джон — парень ого-го, у него это уже третий брак и трое детей от первых браков. Четвертый ребенок — Джейн — это совместный ребенок Джона и Мэри. Плюс у Мэри еще есть Диана, родила от школьного друга. Они поженились, соединим их вместе.

$john = array('name' => 'john', 'children' => array('fred', 'paul', 'sally', 'jane'));
$mary = array('name' => 'mary', 'children' => array('jane', 'diana'));
$john = Arr::merge($john, $mary);

Теперь посмотрим, что получилось:

Array ( [name] => mary [children] => Array ( [0] => fred [1] => paul 
[2] => sally [3] => jane [4] => diana ) )

Как мы видим ключ name имеет значение из второго массива. А вот массив $john['children'] содержит значения обоих массивов, причем без дубликатов. Кстати, если использовать array_merge_recursive, результат будет следующим:

Array ( [name] => Array ( [0] => john [1] => mary ) [children] => Array ( [0] => fred [1] => paul 
[2] => sally [3] => jane [4] => jane [5] => diana ) )

Метод overwrite перезаписывает значения первого массива значениями из второго массива, но ключи, которых нет в первом массиве не добавляются. И опять пример из комментария к методу (а зачем далеко ходить):

$a1 = array('name' => 'Вася', 'mood' => 'счастливый', 'food' => 'пицца');
$a2 = array('name' => 'Гена', 'food' => 'шашлык', 'drink' => 'пиво');
$array = Arr::overwrite($a1, $a2);

Результат будет таким:

Array ( [name] => Гена [mood] => счастливый [food] => шашлык )

То есть фактически это array_merge, но без добавления ключей из второго массива. Может иногда пригодиться.

Метод flatten превращает многомерный массив в одномерный:

$array = array('name' => 'Вася', 'surname' => 'Пупкин', array('speciality' => 'Програмёр', 'experience' => 'Три года'));
$array = Arr::flatten($array);

Получим:

Array ( [name] => Вася [surname] => Пупкин [speciality] => Програмёр [experience] => Три года )

Следующий метод, под названием unshift является измененным вариантом стандартной php-функции array_unshift, которая, как вы знаете, добавляет элементы в начало массива. Отличие метода от стандартной функции в том, что здесь мы можем указать название ключа, а не только значения. Принимает три параметра: массив, добавляемый ключ и его значение. Если такой ключ уже существует, он перетирается и размерность массива остается прежней:

$user = array('name' => 'Вася', 'surname' => 'Пупкин', 'login' => 'vasya_pup');
$user = Arr::unshift($user, 'id', 1);

Результат:

Array ( [id] => 1 [name] => Вася [surname] => Пупкин [login] => vasya_pup )

Следующий на очереди — метод map, который применяет функцию обратного вызова к элементам массива. Его отличие от функции array_map в том, что разбор массива идет рекурсивно, поэтому массив может быть многомерным.

$user = array('id' => 1, 'userinfo' => array('name' => 'Vasya', 'surname' => 'Pupkin', 'login' => 'vasya_pup'));
$user = Arr::map('strtoupper', $user);

Да простит меня Вася, но я специально его имя и фамилию написал английскими буквами, так как многие строковые функции некорректно работают с кодировкой UTF8. В данном случае все сработает как надо и получится такой вот массив:

Array ( [id] => 1 [userinfo] => Array ( [name] => VASYA [surname] => PUPKIN [login] => VASYA_PUP ) )

Несколько забегая вперед, этот же пример, но уже с использованием русских букв:

$user = array('id' => 1, 'userinfo' => array('name' => 'Вася', 'surname' => 'Пупкин', 'login' => 'vasya_pup'));
$user = Arr::map('UTF8::strtoupper', $user);

И с корректной их обработкой:

Array ( [id] => 1 [userinfo] => Array ( [name] => ВАСЯ [surname] => ПУПКИН [login] => VASYA_PUP ) )

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

Ну и последний рассматриваемый в этом уроке метод — range заполняет массив диапазоном чисел:

$values = Arr::range(5, 30);

Результат:

Array ( [5] => 5 [10] => 10 [15] => 15 [20] => 20 [25] => 25 [30] => 30 )

Естественно это не все метода класса Arr. Мы не рассмотрели такие методы как: is_assoc, is_array, path, set_path и callback. Если у вас по ним возникнут какие-то вопросы (или по рассмотренным методам), пишите на форуме, я постараюсь помочь.

<< Назад | Вперед >> | Обсудить на форуме


К записи оставлено 6 коммент.

расширил этот класс методом который заполняет массив указаным значением.

public static function fill(array $array, $default = NULL)
{
foreach ($array as $key => $val)
{
if (is_array($val))
{
$array[$key] = Arr::fill($array[$key], $default);
}
else
{
$array[$key] = $default;
}
}

return $array;
}

работает так

$arr = Arr::fill(array (‘el1′ => », ‘el2′ => »), ‘test’)

$arr => (‘el1′ => ‘test’, ‘el2′ => ‘test’)

Вообщем похоже на стандартный array_fill, только для ассоциативных массивов. Я на форуме позже напишу с нормальными кавычками. Если вы не возражаете.
Спасибо.

вся эта мега функция

/**
* Create array from object
*
* @param mixed $obj Database MySQL Result Object
* @access public
* @return array Associative array
*/
public static function get_array($obj)
{
$array = array();
foreach ($obj as $a => $b)
$array[$a] = $b;

return $array;
}

заменяется одной строчкой $array = (array) $obj;
учите основы, что бы не писать всякий бред

Интересно от Вас услышать чем массив отличается от объекта в своем внутреннем представлении? Как вы считаете может это одно и тоже?



Оставить комментарий или два

Пожалуйста, зарегистрируйтесь для комментирования.