Работа с анонимными функциями

Есть массив товаров

array (
  0 => 'Наименование товара №1_~-250$_~-99$',
  1 => 'Наименование товара №2_~-699$_~-399$',
  2 => 'Наименование товара №3_~-299$_~-149$',
)

Еще массив параметров, которым соответствую характеристики товаров

 array (
  0 => 'Наименование',
  1 => 'Старая цена',
  2 => 'Новая цена',
)

Получаю эти данные из <input type="checkbox" name="upsell[]">, атрибут value заполняю с помощью JS считывая содержимое определенных тегов и через конкатенацию соединяю три строки в одну. Крякозябра _~- - это разделитель, которым в JS соединяю строки, потом в PHP разбираю строку с помощью explode()

$upsells = ['Наименование товара №1_~-250$_~-99$', 'Наименование товара №2_~-699$_~-399$', 'Наименование товара №3_~-299$_~-149$',];
$orderDetails = ['Наименование', 'Старая цена', 'Новая цена'];    

$enumerationGoods = function($upsells) {
            
        $productInformation = explode('_~-', $upsells); 
        $numberProduct .= '<b>Товар №</b> '.($number += 1).':<br />';
        $orderDetails = ['Наименование', 'Старая цена', 'Новая цена'];
            
        for ($i = 0; $i < count($productInformation); $i++) {
            $nomination .= '<b>'.$orderDetails[$i].':</b> '.$productInformation[$i].'<br />';
        }   
        return $numberProduct . $nomination;
    };
        
    $html_parts = array_map($enumerationGoods, $upsells); 
    echo implode('', $html_parts);

Результат

Товар № 1:
Наименование: Наименование товара №1
Старая цена: 250$
Новая цена: 99$
Товар № 1:
Наименование: Наименование товара №2
Старая цена: 699$
Новая цена: 399$
Товар № 1:
Наименование: Наименование товара №3
Старая цена: 299$
Новая цена: 149$

Как исправить работу счетчика товаров?


Ответы (2 шт):

Автор решения: Sergei Kirjanov

К $upsells можно применить array_map и получить массив кусков html.

Анонимная функция передается в array_map, получает на вход 1 $upsell и возвращает 1 кусок html, который ему соответствует.

Потом куски html можно соединить через implode

$render_upsell = function($upsell) {
    $productInformation = explode('_~-', $upsell);
    ...
    return '<b>'.$orderDetails[$i].':</b> '.$productInformation[$i].'<br />';
};

$html_parts = array_map($render_upsell, $upsells);
→ Ссылка
Автор решения: u_mulder

Если ты не можешь понять, как работают анонимные функции - ну не используй их:

$upsells = ['Наименование товара №1_~-250$_~-99$', 'Наименование товара №2_~-699$_~-399$', 'Наименование товара №3_~-299$_~-149$',];
$orderDetails = ['Наименование', 'Старая цена', 'Новая цена'];

$text = '';
foreach ($upsells as $upsell) {
    $productInformation = explode('_~-', $upsell);
    for ($i = 0; $i < count($productInformation); $i++) {
        $text .= '<b>'.$orderDetails[$i].':</b> '.$productInformation[$i].'<br />';
    }    
}

echo $text;

Пример.

→ Ссылка