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

Популярность функции 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);

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


База данный MySql

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

	  $form = '';  $form .= '<form enctype = "multipart/form-data" action = "" method = "POST" >';	  	  if($result){  	while($row = mysqli_fetch_assoc($result)){  		$form .= "<div>";  		foreach($row as $key_product =>$value_product){  			  			if($key_product >= 38  ){  				if( $value_product == 1 ){  					$form .= "<input type='number' name='sale_".$row['id'].'_'.$key_product."' min = '1' max = '".$value_product."' id='sale_".$row['id'].$key_product."' style='width: 50px;' ><label for = 'sale_".$row['id'].$key_product."' >".$key_product.": ".$value_product." Продать</label><br><br>";  					$form .= "<input type='number' name='zakaz_".$row['id']."_".$key_product."' id='zakaz_".$row['id'].$key_product."' min = '1'  style='width: 50px; background: #ccc;' ><label for='zakaz_".$row['id'].$key_product."'>".$key_product.": ".$value_product." Заказать</label><br><br>";  				}else if( $value_product == 0 ){  					$form .= "<input type='number' name='zakaz_".$row['id']."_".$key_product."' id='zakaz_".$row['id'].$key_product."' min = '1'  style='width: 50px; background: #bbb;' ><label for='zakaz_".$row['id'].$key_product."'>".$key_product.": ".$value_product." Заказать</label><br><br>";  				}else{  					$form .= "<input type='number' name='sale_".$row['id'].'_'.$key_product."' id='sale_".$row['id'].$key_product."' min = '1' max = '".$value_product."' style='width: 50px;' ><label for = 'sale_".$row['id'].$key_product."' >".$key_product.": ".$value_product." Продать</label><br><br>";  				}  			}else{  				$form .= $key_product.": ".$value_product."<br>";  			}  		}  		$form .= "</div><br>";  	}  }  echo $form .= '<input type="submit" value="submit"></form>';

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


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

Сборка form html с помощью implode php

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

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

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

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

$form = '';  $form .= '<form enctype = "multipart/form-data" action = "" method = "POST" >';  if($result){  	while($row = mysqli_fetch_assoc($result)){  		foreach($row as $key_product =>$value_product){  			$form_product[$key_product] = '';    			if($key_product >= 38  ){  				if( $value_product == 1 ){  					$form_product[$key_product] = "<input type='number' name='sale_".$row['id'].'_'.$key_product."' min = '1' max = '".$value_product."' id='sale_".$row['id'].$key_product."' style='width: 50px;' ><label for = 'sale_".$row['id'].$key_product."' >Продать ".$row['product'].' - '.$row['model'].' - '.$row['color'].' - '.$key_product.': '.$value_product."</label><br><br>";  					$form_product[$key_product] = "<input type='number' name='zakaz_".$row['id'].'_'.$key_product."' id='zakaz_".$row['id'].$key_product."' min = '1'  style='width: 50px; background: #ccc;' ><label for = 'zakaz_".$row['id'].$key_product."' >Заказать ".$row['product'].' - '.$row['model'].' - '.$row['color'].' - '.$key_product.': '.$value_product."</label><br><br>";  				}else if( $value_product == 0 ){  					$form_product[$key_product] = "<input type='number' name='zakaz_".$row['id'].'_'.$key_product."' id='zakaz_".$row['id'].$key_product."' min = '1'  style='width: 50px; background: #bbb;' ><label for = 'sale_".$row['id'].$key_product."' >Заказать ".$row['product'].' - '.$row['model'].' - '.$row['color'].' - '.$key_product.': '.$value_product."</label><br><br>";  				}else{  					$form_product[$key_product] = "<input type='number' name='sale_".$row['id'].'_'.$key_product."' id='sale_".$row['id'].$key_product."' min = '1' max = '".$value_product."' style='width: 50px;' ><label for = 'sale_".$row['id'].$key_product."' >Продать ".$row['product'].' - '.$row['model'].' - '.$row['color'].' - '.$key_product.': '.$value_product."</label><br><br>";  				}  			}else{  				$form_product[$key_product]= $key_product.": ".$value_product."<br>";  			}  			$form_row[$row['id']] = implode('', $form_product);  		}  	}  }  echo $form .= implode('',$form_row).'</form>';  

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


$form_sklad='Склад ';  $sale = array();  $zakaz = array();  $form_sklad .= '<form enctype = "multipart/form-data" action = "" method = "POST" >';    $sale[$key_product] = $form_product[$key_product] = "<input type='number' name='sale_".$row['id'].'_'.$key_product."' min = '1' max = '".$value_product."' id='sale_".$row['id'].$key_product."' style='width: 50px;' ><label for = 'sale_".$row['id'].$key_product."' >Продать ".$row['product'].' - '.$row['model'].' - '.$row['color'].' - '.$key_product.': '.$value_product."</label><br><br>";    $zakaz[$key_product] = $form_product[$key_product] = "<input type='number' name='zakaz_".$row['id'].'_'.$key_product."' id='zakaz_".$row['id'].$key_product."' min = '1'  style='width: 50px; background: #ccc;' ><label for = 'zakaz_".$row['id'].$key_product."' >Заказать ".$row['product'].' - '.$row['model'].' - '.$row['color'].' - '.$key_product.': '.$value_product."</label><br><br>";    $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>';      

Собираем те же самые строки во вторую форму ($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 enctype = "multipart/form-data" action = "" method = "POST" >';  $form_sklad .= '<form enctype = "multipart/form-data" action = "" method = "POST" >';  	  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] = "<input type='number' name='sale_".$row['id'].'_'.$key_product."' min = '1' max = '".$value_product."' id='sale_".$row['id'].$key_product."' style='width: 50px;' ><label for = 'sale_".$row['id'].$key_product."' >Продать ".$row['product'].' - '.$row['model'].' - '.$row['color'].' - '.$key_product.': '.$value_product."</label><br><br>";  					$zakaz[$key_product] = $form_product[$key_product] = "<input type='number' name='zakaz_".$row['id'].'_'.$key_product."' id='zakaz_".$row['id'].$key_product."' min = '1'  style='width: 50px; background: #ccc;' ><label for = 'zakaz_".$row['id'].$key_product."' >Заказать ".$row['product'].' - '.$row['model'].' - '.$row['color'].' - '.$key_product.': '.$value_product."</label><br><br>";    				}else if( $value_product == 0 ){  					$zakaz[$key_product] = $form_product[$key_product] = "<input type='number' name='zakaz_".$row['id'].'_'.$key_product."' id='zakaz_".$row['id'].$key_product."' min = '1'  style='width: 50px; background: #bbb;' ><label for = 'sale_".$row['id'].$key_product."' >Заказать ".$row['product'].' - '.$row['model'].' - '.$row['color'].' - '.$key_product.': '.$value_product."</label><br><br>";    				}else{  					$sale[$key_product] = $form_product[$key_product] = "<input type='number' name='sale_".$row['id'].'_'.$key_product."' id='sale_".$row['id'].$key_product."' min = '1' max = '".$value_product."' style='width: 50px;' ><label for = 'sale_".$row['id'].$key_product."' >Продать ".$row['product'].' - '.$row['model'].' - '.$row['color'].' - '.$key_product.': '.$value_product."</label><br><br>";  				}  			}else{  				$form_product[$key_product]= $key_product.": ".$value_product."<br>";  			}  			$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).'</form>';   echo $form_sklad .= implode('', $form_row_zakaz).implode('', $form_row_sale).'</form>';

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

Многократное использование строк с помощью implode php

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

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

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

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

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

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

echo $form_row_product_string = implode('<br>', $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 enctype = "multipart/form-data" action = "" method = "POST" >';  $form_sklad .= '<form enctype = "multipart/form-data" action = "" method = "POST" >';  	  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] = "<input type='number' name='sale_".$row['id'].'_'.$key_product."' min = '1' max = '".$value_product."' id='sale_".$row['id'].$key_product."' style='width: 50px;' ><label for = 'sale_".$row['id'].$key_product."' >Продать ".$row['product'].' - '.$row['model'].' - '.$row['color'].' - '.$key_product.': '.$value_product."</label><br><br>";  					$zakaz[$key_product] = $form_product[$key_product] = "<input type='number' name='zakaz_".$row['id'].'_'.$key_product."' id='zakaz_".$row['id'].$key_product."' min = '1'  style='width: 50px; background: #ccc;' ><label for = 'zakaz_".$row['id'].$key_product."' >Заказать ".$row['product'].' - '.$row['model'].' - '.$row['color'].' - '.$key_product.': '.$value_product."</label><br><br>";    				}else if( $value_product == 0 ){  					$zakaz[$key_product] = $form_product[$key_product] = "<input type='number' name='zakaz_".$row['id'].'_'.$key_product."' id='zakaz_".$row['id'].$key_product."' min = '1'  style='width: 50px; background: #bbb;' ><label for = 'sale_".$row['id'].$key_product."' >Заказать ".$row['product'].' - '.$row['model'].' - '.$row['color'].' - '.$key_product.': '.$value_product."</label><br><br>";    				}else{  					$sale[$key_product] = $form_product[$key_product] = "<input type='number' name='sale_".$row['id'].'_'.$key_product."' id='sale_".$row['id'].$key_product."' min = '1' max = '".$value_product."' style='width: 50px;' ><label for = 'sale_".$row['id'].$key_product."' >Продать ".$row['product'].' - '.$row['model'].' - '.$row['color'].' - '.$key_product.': '.$value_product."</label><br><br>";  				}  			}else{  				if( $key_product === "model"){  					$product[3] = '<span>'.$value_product.'</span>';  				}else if( $key_product === "product"){  					$product[2] = '<span>'.$value_product.'</span>';  				}  				else if( $key_product === 'gender' ){  					if( $value_product === '1' ){  						$product[1] = '<span>мужские</span>';  					}else{  						$product[1] = '<span>женские</span>';  					}  				}else if( $key_product === 'color' ){  					$product[4] = '<span>'.$value_product.'</span>';  				}  				$row_product[$row['id']] = $product;  				$form_product[$key_product]= $key_product.": ".$value_product."<br>";  				$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).'</form>';   echo $form_sklad .= implode('', $form_row_zakaz).implode('', $form_row_sale).'</form>';   echo $form_row_product_string = implode('<br>', $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));  

Все способы как объединить массивы в php
В php объединение массивов возможно несколькими способами. Для этого доступны три функции: array_merge(), array_merge_recursive(), implode(). Первая функция и вторая в результате выдают новый массив, последняя объединяет элементы в строку.
далее
PHP: массивы в строку. Преобразование строк в массивы и обратно
Современные алгоритмы обработки информации ориентируются на максимальную скорость и эффективность. Преобразование данных из одного представления в другое является востребованным, часто единственным, механизмом решения задачи.
далее
Функция intval() PHP: преобразование в целое число
Преобразование значений переменных в целые числа имеет смысл, когда требуется преобразовать строку в число, извлечь из вещественного числа целую часть или перевести значение из одной системы счисления в другую. Автоматическое формирование стилей и ...
далее
PHP: работа со строками. Строковые функции PHP
Статья рассчитана на начинающих изучать PHP: в ней описаны самые распространенные функции, связанные с работой со строками.
далее
PHP: массив в массиве. Поиск в массиве PHP
Информация всегда имеет структуру, описание которой набором переменных не всегда оправдано. Массивы значительно упрощают обработку информации, делают компактным код, понятным алгоритм.
далее
Формат JSON: краткое описание, пример
Обмен информацией всегда представлял собой задачу первостепенной важности. Особенно актуальное значение имеет обмен данными между клиентом (браузер) и сервером. Компактность и эффективность, AJAX
далее
Формат JSON: краткое описание, пример
Узнаем как правильно определить количество элементов в массиве PHP?
При использовании массивов имеет значение количество содержащихся в них данных. Особенности синтаксиса и логики языка PHP позволяют динамично определять нужные сведения различными способами.
далее
Узнаем как правильно определить количество элементов в массиве PHP?
Узнаем как из строк убрать пробелы на PHP?
Убрать пробелы в строках можно тремя способами. Функция trim() удаляет лишние символы по бокам строки: пробелы, табуляцию, перенос строки. Функция preg_replace() убирает символы в любом месте строки, для чего используются регулярные выражения. Str_replace() представляет упрощенный вариант preg_replace().
далее
Узнаем как из строк убрать пробелы на PHP?
Регулярные выражения (PHP). PHP: регулярные выражения, примеры
Положить конкретный информационный интерес в алгоритм - задача непростая и часто недостижимая в ее естественном понимании. Сложно формализовать слово «конкретный», а трансформация понятия «интерес» в «техническое задание» - сама по себе серьезная задача.
далее
Регулярные выражения (PHP). PHP: регулярные выражения, примеры
Namespace PHP: пример. Узнаем как использовать пространства имен в PHP?
Пространство имен всегда существовало как часть алгоритма и всегда было «глобальным». В ходе разработки больших проектов, когда создается множество файлов скриптов, многочисленные разработчики могут использовать одинаковые имена, что ставит любой проект под угрозу срыва. Идея пространства имен упростила процесс разработки и открыла программистам новые горизонты.
далее
Namespace PHP: пример. Узнаем как использовать пространства имен в PHP?