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

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

13-05-2018, 22:33
500
Популярність функції 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({});

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

  
$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 .= ' ';

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

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

<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));
Цікаво по темі
Як провести форматування флешки в Linux
Як провести форматування флешки в Linux
Для більшості користувачів відформатувати флешку не складе праці, практично кожен знає, як це робити в операційній системі Windows. Проте багато хто,
Sizeof PHP: розмір масивів та об'єктів, зменшення часу виконання скриптів
Sizeof PHP: розмір масивів та об'єктів, зменшення часу виконання скриптів
PHP: прискорення циклів за допомогою sizeof(), зменшення часу виконання скриптів, підрахунок об'єктів StdClass, створених з json_decode, оптимізація
Checkbox html: приклади гарних кнопок на чистому CSS, створення "акордеона", отримання даних з форм за допомогою PHP і jQuery
Checkbox html: приклади гарних кнопок на чистому CSS, створення "акордеона", отримання даних з форм за допомогою PHP і jQuery
Варіанти застосування html input checkbox дуже великі, але найчастіше цей елемент використовується у формах передачі даних. Однак він вміє виконувати
Метод appendTo в jQuery: вставка елементів
Метод appendTo в jQuery: вставка елементів
Синтаксис і особливості використання методу appendTo в бібліотеці jQuery. Контекст виклику, вхідні параметри і значення, що повертається. Специфіка
Що таке динамічні масиви C++?
Що таке динамічні масиви C++?
Визначимося для початку з тим, що таке динамічний масив. З часів Сі існують масиви, але їх особливістю був фіксований розмір, який зазначався при
Як здійснити запис у файл Java
Як здійснити запис у файл Java
При написанні програм на мові Java рано чи пізно постане необхідність читання і запису інформації в файл. Для цього в мові передбачені наступні