Друзья, помогите сформировать массив.
Есть переменная $str с текстом:
$str = 'Товар 1 - Кол-во: 1 | Сумма: 13000 руб; Товар 2 - Кол-во: 1 | Сумма: 5500 руб; Товар 3 - Кол-во: 1 | Сумма: 3100 руб; Товар N - Кол-во: 1 | Сумма: 3100 руб;'
Товаров может быть 1, а может 10.
Мне нужно порезать данную строку и сложить с них единый массив вида:
$prod_mass=array(array('quantity' => 1,'offer' => array('id' => 77)),array('quantity' => 1,'offer' => array('id' => 78)),array('quantity' => 1,'offer' => array('id' => Товар 3)),array('quantity' => 1,'offer' => array('id' => Товар N)),);
Начало я понимаю.
Нужно
$str = 'Товар 1 - Кол-во: 1 | Сумма: 13000 руб; Товар 2 - Кол-во: 1 | Сумма: 5500 руб; Товар 3 - Кол-во: 1 | Сумма: 3100 руб; Товар N - Кол-во: 1 | Сумма: 3100 руб;'
$newmass = explode (';',$str);
//В итоге мы получим:
$newmass[0] // Товар 1 - Кол-во: 1 | Сумма: 13000 руб;
$newmass[1] // Товар 2 - Кол-во: 1 | Сумма: 13000 руб;
$newmass[2] // Товар 3 - Кол-во: 1 | Сумма: 13000 руб;
$newmass[N] // Товар N - Кол-во: 1 | Сумма: 3100 руб;
//Потом в цикле ещё раз вырезаем куски, чтобы получить в перменные название товара и количество:
$tov1 = explode(' -',$newmass[0])[0] // Товар 1
$kolvo1 = explode(' | ',explode('Кол-во: ',$newmass[0])[1])[0]; // 1
$tov2 = explode(' -',$newmass[1])[0] // Товар 2
$kolvo2 = explode(' | ',explode('Кол-во: ',$newmass[1])[1])[0]; // 1
// и т.д. понимание есть, но цикл я такой затрудняюсь сделать.
//далее, видимо помощью функции array_map
//нужно собрать массив вида:
$prod_mass=array(array('quantity' => 1,'offer' => array('id' => 77)),array('quantity' => 1,'offer' => array('id' => 78)),array('quantity' => 1,'offer' => array('id' => Товар 3)),array('quantity' => 1,'offer' => array('id' => Товар N)),);
//Как это сделать понятия не имею. Даже заплатить готов тому кто сделает.
Кто бы помог оформить это в виде рабочего кода. Был бы очень и очень благодарен.
Как каркас на скорую руку можно использовать, хорошо еще добавить обработчик ошибок
class Item {
private $str;
private $qty = 0;
private $id;
// В конструкторе реализован парсинг самих товаров.
public function __construct($str) {
$this->str = $str;
$matches = [];
// Если я правильно понял, то в самом начале идет наименование товара или ID, после знака "-" идут свойства товара, аля кол-во, сумма и т. п.
preg_match("/^([^-]+)-([\s\S]*)/", $str, $matches);
// Проверяем, что в строке найден наименование или ID товара, а так же свойства товара
if (count($matches) != 3) {
return;
}
$this->id = trim($matches[1]);
// Каждое свойство разделено знаком "|"
$properties = explode('|', $matches[2]);
// Сделаем предположение, что первым элементом всегда идет кол-во товара и он присутствует в массиве
if (!isset($properties[0])) {
return;
}
// Разделяем наименование свойства от значения
$data = explode(':', $properties[0]);
if (count($data) != 2) {
return;
}
$this->qty = (int) $data[1];
}
public function getQty() {
return $this->qty;
}
public function getID() {
return $this->id;
}
}
class Items {
public function Parse($str) {
$res = [];
// Товары разделены символом ";"
$items = explode(';',$str);
// Переберем все товары
foreach ($items as $itemStr) {
$itemStr = trim($itemStr);
if (mb_strlen($itemStr) == 0) {
continue;
}
$item = new Item($itemStr);
$res[] = [
"quantity" => $item->getQty(),
"offer" => [
"id" => $item->getID(),
],
];
}
return $res;
}
}
$str = 'Товар 1 - Кол-во: 10 | Сумма: 13000 руб; Товар 2 - Кол-во: 1 | Сумма: 5500 руб; Товар 3 - Кол-во: 1 | Сумма: 3100 руб; Товар N - Кол-во: 50 | Сумма: 3100 руб;';
$items = new Items();
$res = $items->Parse($str);
print_r($res);
$string = "Товар 11 - Кол-во: 10 | Сумма: 13000 руб; Товар 22 - Кол-во: 20 | Сумма: 5500 руб; Товар 33 - Кол-во: 30 | Сумма: 3100 руб; Товар 44 - Кол-во: 40 | Сумма: 3100 руб";
$goodsData = array_map('makeArray', explode(';', $string));
function makeArray($string)
{
preg_match('/(\d+)/i', $string, $offer);
preg_match('/: (\d+)/i', $string, $quantity);
return [
'quantity' => (int)$quantity[1],
'offer' => [
'id' => (int)$offer[0]
]
];
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
У меня есть форма заполненияВ первой форме клиент пишет номер счет-фактуры, если оно есть в базе то на второй форме появляется сумма которую...
Появилась задача валидации веденных данных клиентомТо есть клиент вводит свои данные в контактной форме ( Contact form 7 ) , его перенаправляет...