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);
Содержимое базы данных:
Для начала соберем форму с помощью обычной конкатенацией строк:
$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>';
Такой метод требует соблюдения строгой последовательности записи, если необходимо поменять одну строку на другую, нужно переписывать код.
В таблице мы видим информацию о товаре, полученную из базы данных:
В данной форме трудно разобраться, какой товар заказывать, а какой продавать, поэтому конкатенация не подходит для больших объемов информации.
Гибкость и многовариантность использования функции 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>';
В результате получаем новую форму, где товар для заказа отдельно от товара для продажи.
Строки мы можем создавать в любом порядке, а затем с помощью числовых индексов массива определять их последовательность. Следующий пример демонстрирует это:
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));