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

12 0 Новини високих технологій

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

Вміст бази даних:

<script async="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js">
<!-- fb_336x280_1 -->

<script> (adsbygoogle = window.adsbygoogle ||[]).push({});
PHP implode: перетворення одновимірних і багатовимірних масивів у рядки, сортування за допомогою числових індексів.

Для початку зберемо форму за допомогою звичайної конкатенацией рядків:

  
$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 .= " name='zakaz_".$row['id']."_".$key_product."' id='zakaz_".$row['id'].$key_product."' min = '1' style='width: 50px; background: #ccc;' >

";
}else if( $value_product == 0 ){
$form .= " style='width: 50px; background: #bbb;' >

";
}else{
$form .= "

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

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

Такий метод вимагає дотримання суворої послідовності запису, якщо необхідно замінити одну лінію на іншу, потрібно переписувати код.

<script async="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js">
<!-- fb_336x280_2 -->

<script> (adsbygoogle = window.adsbygoogle ||[]).push({});

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

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

В даній формі важко розібратися, який товар замовляти, а який продавати, тому конкатенація не підходить для великих обсягів інформації.

Гнучкість і багатоваріантність використання функції 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]= "

";
}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 ми можемо маніпулювати рядками. Додамо додаткові масиви і створимо ще одну форму:


<script type="text/javascript">
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/javascript",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]= "

";

$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 (продати останню пару цього розміру).


<script type="text/javascript">
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/javascript",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]= "

";
$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;' >

";

}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;' >

";

}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;' >

";
}
}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 async="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js">

<script> (adsbygoogle = window.adsbygoogle ||[]).push({});
PHP implode: перетворення одновимірних і багатовимірних масивів у рядки, сортування за допомогою числових індексів.

Рядки ми можемо створювати в будь-якому порядку, а потім за допомогою числових індексів масиву визначати їх послідовність. Наступний приклад демонструє це:

  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/javascript">
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/javascript",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]= "

";
$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));