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);
Вміст бази даних:
<!-- fb_336x280_1 -->
<script> (adsbygoogle = window.adsbygoogle ||[]).push({});
Для початку зберемо форму за допомогою звичайної конкатенацией рядків:
$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 .= ' ';
Такий метод вимагає дотримання суворої послідовності запису, якщо необхідно замінити одну лінію на іншу, потрібно переписувати код.
<!-- fb_336x280_2 -->
<script> (adsbygoogle = window.adsbygoogle ||[]).push({});
У таблиці ми бачимо інформацію про товар, отриману з бази даних:
В даній формі важко розібратися, який товар замовляти, а який продавати, тому конкатенація не підходить для великих обсягів інформації.
Гнучкість і багатоваріантність використання функції 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]= ";
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 ми можемо маніпулювати рядками. Додамо додаткові масиви і створимо ще одну форму:
<script type="text/jаvascript">
var blockSettings2 = {blockId:"R-A-70350-39",renderTo:"yandex_rtb_R-A-70350-39",async:!0};
if(document.cookie.indexOf("abmatch=") >= 0) blockSettings2.statId = 70350;
!function(a,b,c,d,e){a[c]=a[c]||[],a[c].push(function(){Ya.Context.AdvManager.render(blockSettings2)}),e=b.getElementsByTagName("script")[0],d=b.createElement("script"),d.type="text/jаvascript",d.src="//an.yandex.ru/system/context.js",d.async=!0e.parentNode.insertBefore(d,e)}(this,this.document,"yandexContextAsyncCallbacks");
$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 (продати останню пару цього розміру).
<script type="text/jаvascript">
var blockSettings3 = {blockId:"R-A-70350-44",renderTo:"yandex_rtb_R-A-70350-44",async:!0};
if(document.cookie.indexOf("abmatch=") >= 0) blockSettings3.statId = 70350;
!function(a,b,c,d,e){a[c]=a[c]||[],a[c].push(function(){Ya.Context.AdvManager.render(blockSettings3)}),e=b.getElementsByTagName("script")[0],d=b.createElement("script"),d.type="text/jаvascript",d.src="//an.yandex.ru/system/context.js",d.async=!0e.parentNode.insertBefore(d,e)}(this,this.document,"yandexContextAsyncCallbacks");
Таким чином, немає необхідності створювати ще один цикл і переписувати рядки знову і знову.
Все разом виглядає так:
$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).' ';
В результаті отримуємо нову форму, де товар для замовлення окремо від товару для продажу.
<script> (adsbygoogle = window.adsbygoogle ||[]).push({});
Рядки ми можемо створювати в будь-якому порядку, а потім за допомогою числових індексів масиву визначати їх послідовність. Наступний приклад демонструє це:
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);
В даному прикладі рядка виводиться таким чином: "чоловічі - черевики - модель - колір". Якщо поміняти індекси, то послідовність виведення зміниться, з допомогою індексів дуже легко змінювати їх порядок.
<script type="text/jаvascript">
var blockSettings = {blockId:"R-A-70350-45",renderTo:"yandex_rtb_R-A-70350-45",async:!0};
if(document.cookie.indexOf("abmatch=") >= 0) blockSettings.statId = 70350;
!function(a,b,c,d,e){a[c]=a[c]||[],a[c].push(function(){Ya.Context.AdvManager.render(blockSettings)}),e=b.getElementsByTagName("script")[0],d=b.createElement("script"),d.type="text/jаvascript",d.src="//an.yandex.ru/system/context.js",d.async=!0e.parentNode.insertBefore(d,e)}(this,this.document,"yandexContextAsyncCallbacks");
Об'єднуємо елементи масиву $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]= "Продати ".$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));