09-06-2018 11:54

PHP implode: преобразование одномерных и многомерных массивов в строки, сортировка с помощью числовых индексов.

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

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

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

Wuauclt.exe - что за процесс и является ли он вирусомВам будет интересно:Wuauclt.exe - что за процесс и является ли он вирусом

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

Подключаемся к базе данных.

$hostname="localhost"; $username="root"; $password=""; $dbname="my_database"; $usertable="my_table"; $yourfield = "product";

$con = mysqli_connect($hostname,$username, $password); mysqli_select_db($con, $dbname); mysqli_set_charset($con,"utf8");

$query = "SELECT * FROM $usertable";

$result = mysqli_query($con, $query); mysqli_close($con);

Содержимое базы данных:

Для начала соберем форму с помощью обычной конкатенацией строк:

$form = ''; $form .= '

';

if($result){ while($row = mysqli_fetch_assoc($result)){ $form .= "

"; foreach($row as $key_product =>$value_product){

if($key_product >= 38 ){ if( $value_product == 1 ){ $form .= "

"; $form .= "

"; }else if( $value_product == 0 ){ $form .= "

"; }else{ $form .= "

"; } }else{ $form .= $key_product.": ".$value_product."
"; } } $form .= "


"; } } echo $form .= '
';

CSS transitions: примеры анимации фона, текста, создания css-аккондеона input radio и затухающего "fade-out" текстаВам будет интересно:CSS transitions: примеры анимации фона, текста, создания css-аккондеона input radio и затухающего "fade-out" текста

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

В таблице мы видим информацию о товаре, полученную из базы данных:

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

Гибкость и многовариантность использования функции implode()

Записывая строки в массив, а затем объединяя их с помощью php implode, мы получаем гораздо больше вариантов написания кода.

Перепишем наш код: удалим конкатенацию, вместо нее строки будут внесены в массив и собраны функцией implode():

$form = ''; $form .= '

'; if($result){ while($row = mysqli_fetch_assoc($result)){ foreach($row as $key_product =>$value_product){ $form_product[$key_product] = '';

HTTPS - как сделать точные настройки в Apache, nginx и robots.txt при установке бесплатного SSL-сертификата Let's Encrypt на облачный LinuxВам будет интересно:HTTPS - как сделать точные настройки в Apache, nginx и robots.txt при установке бесплатного SSL-сертификата Let's Encrypt на облачный Linux

if($key_product >= 38 ){ if( $value_product == 1 ){ $form_product[$key_product] = "

"; $form_product[$key_product] = "

"; }else if( $value_product == 0 ){ $form_product[$key_product] = "

"; }else{ $form_product[$key_product] = "

"; } }else{ $form_product[$key_product]= $key_product.": ".$value_product."
"; } $form_row[$row['id']] = implode('', $form_product); } } } echo $form .= implode('',$form_row).'

';

Допустим, нам нужна еще одна отдельная таблица для менеджеров, где ячейки "Заказать" и "Продать" должны быть отдельно. Благодаря php array implode мы можем манипулировать строками. Добавим дополнительные массивы и создадим еще одну форму:

$form_sklad='Склад '; $sale = array(); $zakaz = array(); $form_sklad .= '

';

$sale[$key_product] = $form_product[$key_product] = "

";

$zakaz[$key_product] = $form_product[$key_product] = "

";

$form_row_zakaz[$row['id']] = implode('', $zakaz); $form_row_sale[$row['id']] = implode('', $sale);

echo $form_sklad .= implode('', $form_row_zakaz).implode('', $form_row_sale).'

';

Собираем те же самые строки во вторую форму ($form_sklad). "Заказать" помещаем в массив $zakaz, а "продать" - в массив $sale. Следовательно, каждая единица товара окажется либо в массиве $sale, либо в $zakaz. Единица товара - это одна пара обуви определенного размера (от 38 до 42). Один ряд ($row['id']) в базе данных содержит товар одной и той же модели, но разных размеров, поэтому далее объединяем с помощью php implode все единицы товара одной модели в массивы $form_row_zakaz и $form_row_sale. Если осталась одна пара обуви одного размера, то такой товар окажется как в массиве $zakaz (товар заканчивается), так и в массиве $sale (продать последнюю пару этого размера).

Таким образом, нет необходимости создавать еще один цикл и переписывать строки снова и снова.

Все вместе выглядит так:

$form = ''; $form_sklad='Склад '; $sale = array(); $zakaz = array(); $form .= '

'; $form_sklad .= '';

if($result){ while($row = mysqli_fetch_assoc($result)){ foreach($row as $key_product =>$value_product){ $sale[$key_product] = $zakaz[$key_product] = $form_product[$key_product] = '';

if($key_product >= 38 ){ if( $value_product == 1 ){ $sale[$key_product] = $form_product[$key_product] = "

"; $zakaz[$key_product] = $form_product[$key_product] = "

";

Pcalua exe - что это за программа в WindowsВам будет интересно:Pcalua exe - что это за программа в Windows

}else if( $value_product == 0 ){ $zakaz[$key_product] = $form_product[$key_product] = "

";

}else{ $sale[$key_product] = $form_product[$key_product] = "

"; } }else{ $form_product[$key_product]= $key_product.": ".$value_product."
"; } $form_row[$row['id']] = implode('', $form_product); $form_row_zakaz[$row['id']] = implode('', $zakaz); $form_row_sale[$row['id']] = implode('', $sale); } } } echo $form .= implode('',$form_row).'

'; echo $form_sklad .= implode('', $form_row_zakaz).implode('', $form_row_sale).'';

В результате получаем новую форму, где товар для заказа отдельно от товара для продажи.

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

if( $key_product === "model"){ $product[3] = ''.$value_product.''; }else if( $key_product === "product"){ $product[2] = ''.$value_product.''; } else if( $key_product === 'gender' ){ if( $value_product === '1' ){ $product[1] = 'мужские'; }else{ $product[1] = 'женские'; } }else if( $key_product === 'color' ){ $product[4] = ''.$value_product.''; } ksort($product);

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

Объединяем элементы массива $product с помощью php implode

$form_row_product[$row['id']] = implode(' ', $product);

и затем выведем на страницу, где это необходимо:

echo $form_row_product_string = implode('
', $form_row_product);

Объединение значений многомерных массивов в строки с помощью implode(), array_map() и array_column()

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

$row_product[$row['id']] = $product;

Теперь мы сможем вызвать значение массива с помощью array_map:

echo implode(', ', array_map(function ($entry) { $shoes = array($entry[3], $entry[1]); $shoes_string = implode(' ', $shoes); return $shoes_string; }, $row_product));

Последний пример выведет все модели обуви - мужские они или женские, можно вывести также цвет и все остальные значения из массива $product.

Если нужно получить только одно значение из $row_product, можно применить функцию array_column:

echo implode('', array_column($row_product, 3));

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

Весь код:

$hostname="localhost"; $username="root"; $password=""; $dbname="my_database"; $usertable="my_table"; $yourfield = "product";

$con = mysqli_connect($hostname,$username, $password); mysqli_select_db($con, $dbname); mysqli_set_charset($con,"utf8");

$query = "SELECT * FROM $usertable";

$result = mysqli_query($con, $query); mysqli_close($con);

$form = ''; $form_sklad='Склад '; $sale = array(); $zakaz = array(); $product = array(); $row_product = array(); $form .= '

'; $form_sklad .= '';

if($result){ while($row = mysqli_fetch_assoc($result)){ foreach($row as $key_product =>$value_product){ $sale[$key_product] = $zakaz[$key_product] = $form_product[$key_product] = '';

if($key_product >= 38 ){ if( $value_product == 1 ){ $sale[$key_product] = $form_product[$key_product] = "

"; $zakaz[$key_product] = $form_product[$key_product] = "

";

}else if( $value_product == 0 ){ $zakaz[$key_product] = $form_product[$key_product] = "

";

}else{ $sale[$key_product] = $form_product[$key_product] = "

"; } }else{ if( $key_product === "model"){ $product[3] = ''.$value_product.''; }else if( $key_product === "product"){ $product[2] = ''.$value_product.''; } else if( $key_product === 'gender' ){ if( $value_product === '1' ){ $product[1] = 'мужские'; }else{ $product[1] = 'женские'; } }else if( $key_product === 'color' ){ $product[4] = ''.$value_product.''; } $row_product[$row['id']] = $product; $form_product[$key_product]= $key_product.": ".$value_product."
"; $form_row_product[$row['id']] = implode(' ', $product); } $form_row[$row['id']] = implode('', $form_product); $form_row_zakaz[$row['id']] = implode('', $zakaz); $form_row_sale[$row['id']] = implode('', $sale); } } } echo $form .= implode('',$form_row).'

'; echo $form_sklad .= implode('', $form_row_zakaz).implode('', $form_row_sale).''; echo $form_row_product_string = implode('
', $form_row_product);

echo implode(', ', array_map(function ($entry) { $shoes = array($entry[3], $entry[1]); $shoes_string = implode('', $shoes); return $shoes_string; }, $row_product)); echo $array_column = implode('', array_column($row_product, 3));



Источник