php: "sscanf", чтобы "потреблять" строку, но позволяет пропустить параметр - PullRequest
1 голос
/ 25 мая 2011

Это для osCommerce вклада под названием («Автоматически добавлять несколько товаров с атрибутом в корзину из внешнего источника»)

Этот существующий код использует sscanf для "взрыва" строки, представляющей
- идентификатор продукта,
- опция продукта,
- и количество:

sscanf('28{8}17[1]', '%d{%d}%d[%f]', 
  $productID,                       // 28
  $productOptionID, $optionValueID, //{8}17 <--- Product Options!!!
  $productQuantity                  //[1]
);

Это прекрасно работает, если имеется только 1 «набор» опций продукта (например, {8} 17).

Но эту процедуру необходимо адаптировать так, чтобы она могла обрабатывать несколько опций продукта и помещать их в массив, например ::

'28{8}17{7}15{9}19[1]' //array(8=>17, 7=>15, 9=>19)
OR
'28{8}17{7}15[1]'      //array(8=>17, 7=>15)
OR
'28{8}17[1]'           //array(8=>17)

Заранее спасибо. (Я паскаль программист)

Ответы [ 2 ]

3 голосов
/ 25 мая 2011

Вы не должны пытаться делать сложные рекурсивные разборы с одним sscanf.Вставьте это в петлю.Что-то вроде:

<?php

$str = "28{8}17{7}15{9}19[1]";
#$str = "28{8}17{7}15[1]";
#$str = "28{8}17[1]";
sscanf($str,"%d%s",$prod,$rest);
printf("Got prod %d\n", $prod);
while (sscanf($rest,"{%d}%d%s",$opt,$id,$rest))
 {
   printf("opt=%d id=%d\n",$opt,$id);
 }
sscanf($rest,"[%d]",$quantity);
printf("Got qty %d\n",$quantity);
?>
1 голос
/ 25 мая 2011

Может быть, регулярные выражения могут быть интересны

$a = '28{8}17{7}15{9}19[1]';
$matches = null;
preg_match_all('~\\{[0-9]{1,3}\\}[0-9]{1,3}~', $a, $matches);

Чтобы получить другие вещи

$id = (int) $a; // ;)
$quantity = substr($a, strrpos($a, '[')+ 1, -1);

По комментарию небольшое обновление

$a = '28{8}17{7}15{9}19[1]';
$matches = null;
preg_match_all('~\\{([0-9]{1,3})\\}([0-9]{1,3})~', $a, $matches, PREG_SET_ORDER);
$result = array();
foreach ($matches as $entry) {
  $result[$entry[1]] = $entry[2];
}
...