Несмотря на то, что функций для работы с массивами в 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. Если у вас по ним возникнут какие-то вопросы (или по рассмотренным методам), пишите на форуме, я постараюсь помочь.
<< Назад | Вперед >> |
Пожалуйста, зарегистрируйтесь для комментирования.
расширил этот класс методом который заполняет массив указаным значением.
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, только для ассоциативных массивов. Я на форуме позже напишу с нормальными кавычками. Если вы не возражаете.
Спасибо.
http://codepaste.ru/11386/
вся эта мега функция
/**
* 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;
учите основы, что бы не писать всякий бред
Поддерживаю!
Интересно от Вас услышать чем массив отличается от объекта в своем внутреннем представлении? Как вы считаете может это одно и тоже?