Помогите сформировать массив на php

102
21 мая 2021, 00:20

Друзья, помогите сформировать массив.

Есть переменная $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)),); 
//Как это сделать понятия не имею. Даже заплатить готов тому кто сделает.

Кто бы помог оформить это в виде рабочего кода. Был бы очень и очень благодарен.

Answer 1

Как каркас на скорую руку можно использовать, хорошо еще добавить обработчик ошибок

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);
Answer 2
$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]
        ]
    ];
}
READ ALSO
Как очистить форму при неправильном заполнении?

Как очистить форму при неправильном заполнении?

У меня есть форма заполненияВ первой форме клиент пишет номер счет-фактуры, если оно есть в базе то на второй форме появляется сумма которую...

117
Требуется вывод введенных данных с contact form 7

Требуется вывод введенных данных с contact form 7

Появилась задача валидации веденных данных клиентомТо есть клиент вводит свои данные в контактной форме ( Contact form 7 ) , его перенаправляет...

181
Как правильно перебрать данный массив

Как правильно перебрать данный массив

С сервера приходит вот такой массив:

108