Reg.ru: домены и хостинг

Крупнейший регистратор и хостинг-провайдер в России.

Более 2 миллионов доменных имен на обслуживании.

Продвижение, почта для домена, решения для бизнеса.

Более 700 тыс. клиентов по всему миру уже сделали свой выбор.

Перейти на сайт->

Бесплатный Курс "Практика HTML5 и CSS3"

Освойте бесплатно пошаговый видеокурс

по основам адаптивной верстки

на HTML5 и CSS3 с полного нуля.

Начать->

Фреймворк Bootstrap: быстрая адаптивная вёрстка

Пошаговый видеокурс по основам адаптивной верстки в фреймворке Bootstrap.

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

Верстайте на заказ и получайте деньги.

Получить в подарок->

Бесплатный курс "Сайт на WordPress"

Хотите освоить CMS WordPress?

Получите уроки по дизайну и верстке сайта на WordPress.

Научитесь работать с темами и нарезать макет.

Бесплатный видеокурс по рисованию дизайна сайта, его верстке и установке на CMS WordPress!

Получить в подарок->

*Наведите курсор мыши для приостановки прокрутки.


Слияние массивов. Преобразование массива в строку

Слияние массивов

Достаточно частой задачей при работе с массивами является соединение двух массивов в один. Это называется "слияние".

Для технической реализации этого момента над понадобится функция array_merge():


$garden = array_merge($fruits, $vegetables);

Детали

Функция array_merge() работает как с заранее определенными массивами, так и с массивами, определяемыми по ходу работы при помощи array():


$p_languages = array('Perl', 'PHP');
$p_languages = array_merge($p_languages, array('Python'));
print_r($p_languages);

Array
(
    [0] => Perl
    [1] => PHP
    [2] => Python
)

Следовательно, объединяемые массивы могут быть как уже существующими (как в случае с $p_languages), так и анонимными (как array('Python')).

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


array_push($p_languages, array('Python'));
print_r($p_languages);

Array
(
    [0] => Perl
    [1] => PHP
    [2] => Array
        (
            [0] => Python
        )
)

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

Если же идет слияние массивов со строковыми ключами, то значения из второго массива заменяют значения с одинаковыми ключами.

Ну а для массивов с обоими типами ключей реализуются оба типа поведения. Например:


$lc = array('a', 'b' => 'b'); // Значения - буквы нижнего регистра
$uc = array('A', 'b' => 'B'); // Значения - буквы верхнего регистра
$ac = array_merge($lc, $uc);  // Все регистры?

print_r($ac);

Array
(
    [0] => a
    [b] => B
    [1] => A
)

Что получилось в итоге?

Буква A (в верхнем регистре) была размещена под индексом 1 вместо 0 для предотвращения коллизии и присоединена в конце итогового массива. Буква же B (в верхнем регистре) заменила букву b в нижнем регистре на ее исходном месте в массиве.

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


print_r($uc + $lc);
print_r($lc + $uc);

Array
(
    [0] => A
    [b] => B
)

Array
(
    [0] => a
    [b] => b
)

Так как оба значения, a и A, имеют ключ 0, а значения b и B имеют ключ b, в итоге в объединенных массивах остаются только два элемента.

В первом случае результат $a+$b представляет собой $b, а во втором результат $b+$a представляет собой $a.

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

Это был необходимый минимум для понимания того, как происходит объединение массивов.

Рассмотрим кратко еще одну операцию.


Преобразование массива в строку

Пусть перед нами стоит задача "вырвать" элементы массива и выстроить в виде некой отформатированной строки.

В этом нам поможет функция join():


// Построение списка, разделенного запятыми
$string = join(',', $array);

Другой вариант - сформировать необходимую строку в цикле:

$string = '';

foreach ($array as $key => $value)
{
    $string .= ",$value";
}

$string = substr($string, 1); // Удаление "," в начале

Детали

Если для ваших нужд решение с функцией join() срабатывает, я рекомендую остановиться именно на нем, ведь этот вариант работает быстрее любого решения на базе PHP-цикла.

И все бы ничего, но функции join() порой не хватает гибкости.

Прежде всего, она вставляет ограничители только между элементами, а не заключает элементы в них. Чтобы заключить элементы, например, в HTML-теги <b> и разделить их запятыми, придется немного поплясать с бубном))


$left  = '<b>';
$right = '</b>';
$html = $left . join("$right,$left", $html) . $right;

Кроме того, join() не различает значения. Если вы хотите включить подмножество элементов, цикл придется проводить самостоятельно:


$string = '';

foreach ($fields as $key => $value)
{
    // Пароль не включается
    if ('password' != $key) {
        $string .= ",<b>$value</b>";
    }
}

$string = substr($string, 1); // Удаление "," в начале

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


$string = '';

foreach ($fields as $key => $value)
{
    // Пароль не включается
    if ('password' != $value) {
        if (!empty($string)) { $string .= ','; }
        $string .= "<b>$value</b>";
    }
}

Как видим, здесь нам приходится проверять $string при каждом присоединении промежуточного значения.

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

Понравился материал и хотите отблагодарить?
Просто поделитесь с друзьями и коллегами!


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

PHP: Получение информации об объекте или классе, методах, свойствах и наследовании

PHP: Получение информации об объекте или классе, методах, свойствах и наследовании

CodeIgniter: жив или мертв?

CodeIgniter: жив или мертв?

Функции обратного вызова, анонимные функции и механизм замыканий

Функции обратного вызова, анонимные функции и механизм замыканий

Применение функции к каждому элементу массива

Применение функции к каждому элементу массива

Деструктор и копирование объектов с помощью метода __clone()

Деструктор и копирование объектов с помощью метода __clone()

Эволюция веб-разработчика или Почему фреймворк - это хорошо?

Эволюция веб-разработчика или Почему фреймворк - это хорошо?

Магические методы в PHP или методы-перехватчики (сеттеры, геттеры и др.)

Магические методы в PHP или методы-перехватчики (сеттеры, геттеры и др.)

PHP: Удаление элементов массива

PHP: Удаление элементов массива

Ключевое слово final (завершенные классы и методы в PHP)

Ключевое слово final (завершенные классы и методы в PHP)

50 классных сервисов, программ и сайтов для веб-разработчиков

50 классных сервисов, программ и сайтов для веб-разработчиков

Наверх