$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 .= "".$key_product.": ".$value_product." Продати
";
$form .= " name='zakaz_".$row['id']."_".$key_product."' id='zakaz_".$row['id'].$key_product."' min = '1' style='width: 50px; background: #ccc;' >".$key_product.": ".$value_product." Замовити
";
}else if( $value_product == 0 ){
$form .= " style='width: 50px; background: #bbb;' >".$key_product.": ".$value_product." Замовити
";
}else{
$form .= "".$key_product.": ".$value_product." Продати
";
}
}else{
$form .= $key_product.": ".$value_product."
";
}
}
$form .= "
";
}
}
echo $form .= ' ';
Такий метод вимагає дотримання суворої послідовності запису, якщо необхідно замінити одну лінію на іншу, потрібно переписувати код.
У таблиці ми бачимо інформацію про товар, отриману з бази даних:
В даній формі важко розібратися, який товар замовляти, а який продавати, тому конкатенація не підходить для великих обсягів інформації.
Записуючи рядок в масив, а потім об'єднуючи їх за допомогою php implode, ми отримуємо значно більше варіантів написання коду.
Перепишемо наш код: видалимо конкатенацию, замість неї рядки будуть внесені в масив і зібрані функцією implode():
$form = ";
$form .= ' ';
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]= " 'sale_".$row['id'].$key_product."' >Продати ".$row['product'].' - '.$row['model'].' - '.$row['color'].' - '.$key_product.': '.$value_product."
";
$form_product[$key_product]= "Замовити ".$row['product'].' - '.$row['model'].' - '.$row['color'].' - '.$key_product.': '.$value_product."
";
}else if( $value_product == 0 ){
$form_product[$key_product]= "Замовити ".$row['product'].' - '.$row['model'].' - '.$row['color'].' - '.$key_product.': '.$value_product."
";
}else{
$form_product[$key_product]= "Продати ".$row['product'].' - '.$row['model'].' - '.$row['color'].' - '.$key_product.': '.$value_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]= "Продати ".$row['product'].' - '.$row['model'].' - '.$row['color'].' - '.$key_product.': '.$value_product."
";
$zakaz[$key_product]= $form_product[$key_product]= "Замовити ".$row['product'].' - '.$row['model'].' - '.$row['color'].' - '.$key_product.': '.$value_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]= "Продати ".$row['product'].' - '.$row['model'].' - '.$row['color'].' - '.$key_product.': '.$value_product."
";
$zakaz[$key_product]= $form_product[$key_product]= " name='zakaz_".$row['id'].'_'.$key_product."' id='zakaz_".$row['id'].$key_product."' min = '1' style='width: 50px; background: #ccc;' >Замовити ".$row['product'].' - '.$row['model'].' - '.$row['color'].' - '.$key_product.': '.$value_product."
";
}else if( $value_product == 0 ){
$zakaz[$key_product]= $form_product[$key_product]= " type='number' name='zakaz_".$row['id'].'_'.$key_product."' id='zakaz_".$row['id'].$key_product."' min = '1' style='width: 50px; background: #bbb;' >Замовити ".$row['product'].' - '.$row['model'].' - '.$row['color'].' - '.$key_product.': '.$value_product."
";
}else{
$sale[$key_product]= $form_product[$key_product]= " name='sale_".$row['id'].'_'.$key_product."' id='sale_".$row['id'].$key_product."' min = '1' max = '".$value_product."' style='width: 50px;' >Продати ".$row['product'].' - '.$row['model'].' - '.$row['color'].' - '.$key_product.': '.$value_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);
Щоб отримати будь-які рядки в будь-якому місці коду, створимо багатовимірний масив $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]= "Продати ".$row['product'].' - '.$row['model'].' - '.$row['color'].' - '.$key_product.': '.$value_product."
";
$zakaz[$key_product]= $form_product[$key_product]= "Замовити ".$row['product'].' - '.$row['model'].' - '.$row['color'].' - '.$key_product.': '.$value_product."
";
}else if( $value_product == 0 ){
$zakaz[$key_product]= $form_product[$key_product]= "Замовити ".$row['product'].' - '.$row['model'].' - '.$row['color'].' - '.$key_product.': '.$value_product."
";
}else{
$sale[$key_product]= $form_product[$key_product]= "Продати ".$row['product'].' - '.$row['model'].' - '.$row['color'].' - '.$key_product.': '.$value_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));