+1 к следующей функции

vadikvip777

Здравствуйте. Есть небольшой php код

PHP:
  1. foreach ($order_product_query->rows as $product) {
  2.     $product[0] .= $product[‘model’];              //Модель
  3.     $product_kol[0] .= $product[‘quantity’];     //Количество
  4. }

выводит модель товара и количество, после отправляет в CRM
Все работает, но столкнулся с проблемой, товаров обычно больше одного, и надо 0 заменить на переменную, к примеру пусть будет $i = 0

создал такой код:

PHP:
  1. $i= 0;
  2. foreach ($order_product_query->rows as $product) {
  3.     $product[$i] .= $product[‘model’];
  4.     $product_kol[$i] .= $product[‘quantity’];
  5.     $i++;
  6. }

По идеи после добавления каждого товара должно добавляться +1, но почему-то не работает :(
Я в php новичок, подскажите, пожалуйста, где ошибка :)

 

abrdabr

@vadikvip777 как выводишь результат?

 

Рихард

$i = 0; объявляешь в глобальным параметром
а потом пытаешься его исполнить локальным;
Может $i = 0 перенести в тело функции и переделать ++$i;

я сам новичок

 

vadikvip777

отправляю в crm
вот весь код:

PHP:
  1.         $i= 0;
  2.         foreach ($order_product_query->rows as $product) {
  3.             $product[$i] .= $product[‘model’];
  4.             $product_kol[$i] .= $product[‘quantity’];
  5.             $i++;
  6.         }
  7.                        
  8.         //детали заказа в кодировке utf-8
  9.         $param[‘secret’] = «000»;            //ключ api
  10.         $param[‘phone’] .= $order_info[‘telephone’];    //телефон
  11.         $param[‘name’]    .= $order_info[‘payment_firstname’];         //имя клиента
  12.  
  13.         //подготовка запроса              
  14.         foreach ($param as $key => $value) {
  15.             $data .= «&».$key.«=».$value;
  16.         }
  17.        
  18.         //содержимое заказа
  19.         foreach ($product as $key => $value){
  20.             $data .= «&product[«.$key.«]=».$value.«»;
  21.             $data .= «&product_kol[«.$key.«]=».$product_kol[$key].«»;
  22.             if(isset($product_mod[$key])) {
  23.                 $data .= «&product_mod[«.$key.«]=».$product_mod[$key].«»;
  24.             }
  25.         }
  26.  
  27.         //отправка
  28.         $ch = curl_init();
  29.         curl_setopt($ch, CURLOPT_URL, «https://app.frontpad.ru/api/index.php?new_order»);
  30.         curl_setopt($ch, CURLOPT_FAILONERROR, 1);
  31.         curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
  32.         curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  33.         curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
  34.         curl_setopt($ch, CURLOPT_TIMEOUT, 30);
  35.         curl_setopt($ch, CURLOPT_POST, 1);
  36.         curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
  37.         $result = curl_exec($ch);
  38.         curl_close($ch);
  39.        
  40.         //результат
  41.         echo $result;
 

Рихард

echo там не нужно???

 

vadikvip777

нет

 

Рихард

$i = 0 Если закинуть в тело foreach не поможет?

 

vadikvip777

Нет
получается что мы каждый раз будем сбрасывать $i = 0, то есть ++$i не работает)

 

Рихард

тогда надо включить «static» к переменной или создать ссылку на нее «&»

 

vadikvip777

не работает:(

 

Рихард

это называется оказал тебе медвежью услугу.

А не проще создать свою функцию и в теле функции объявить foreach
— Добавлено —
function foo()
{
static $x = 0;
echo $x++;
}
foo();
foo();
foo();

Словами объяснить не могу, вчера проходит.
Попробуй так
— Добавлено —
Или так
function foo(задаешь параметры, &$x)
{
включаешь foreach
$x = 0; или static $x=0;
$x++;
}
— Добавлено —
то есть пойдет не копирование переменной а ссылка на нее

 

vadikvip777

так не отправляет ничего

 

romach

PHP:
  1. foreach ($order_product_query->rows as $product) {
  2.     $product[0] .= $product[‘model’];              //Модель
  3.     $product_kol[0] .= $product[‘quantity’];     //Количество
  4. }

Так, давайте по порядку. Вы в цикле проходите записи $rows каждый раз получая конкретную запись $product, в $product[0] вы записываете значения $product[‘model’], $product_kol вообще не понятно откуда берется, да и не важно всё это, потому что следующей итерацией вы получите новый $product. И зачем тут .=?

 

vadikvip777

Это движок OpenCart, в данном случае отправка данных о заказе на почту
В этот же файл я засунул отправку только некоторых данных на crm, выше написал код
$product[0]
и
$product_kol[0]
Создаются для сложения ссылки, которая отправит данные в crm
то есть получается так

$product[0] .= $product[‘model’];
Продукт 0 берет модель товара

$product_kol[0] .= $product[‘quantity’];
Продукт 0 берет количество товара

и далее таких товаро может получится хоть 20, то есть по идем должно сложится
$product[0] .= $product[‘model’]; //Модель
$product_kol[0] .= $product[‘quantity’]; //Количество
$product[1] .= $product[‘model’]; //Модель
$product_kol[1] .= $product[‘quantity’]; //Количество
$product[2] .= $product[‘model’]; //Модель
$product_kol[2] .= $product[‘quantity’]; //Количество
$product[3] .= $product[‘model’]; //Модель
$product_kol[3] .= $product[‘quantity’]; //Количество

.= добавил потому что иначе вообще не работало)

 

keren

Приведи что содержится в $order_product_query->rows и что должно быть после обработки.

 

vadikvip777

PHP:
  1. foreach ($order_product_query->rows as $product) {
  2.                         $text .= $product[‘quantity’] . ‘x ‘ . $product[‘name’] . ‘ (‘ . $product[‘model’] . ‘) ‘ . html_entity_decode($this->currency->format($product[‘total’] + ($this->config->get(‘config_tax’) ? ($product[‘tax’] * $product[‘quantity’]) : 0), $order_info[‘currency_code’], $order_info[‘currency_value’]), ENT_NOQUOTES, ‘UTF-8’) . «n«;
  3.  
  4.                         $order_option_query = $this->db->query(«SELECT * FROM « . DB_PREFIX . «order_option WHERE order_id = ‘» . (int)$order_id . «‘ AND order_product_id = ‘» . $product[‘order_product_id’] . «‘»);
  5.  
  6.                         foreach ($order_option_query->rows as $option) {
  7.                             if ($option[‘type’] != ‘file’) {
  8.                                 $value = $option[‘value’];
  9.                             } else {
  10.                                 $value = utf8_substr($option[‘value’], 0, utf8_strrpos($option[‘value’], ‘.’));
  11.                             }
  12.  
  13.                             $text .= chr(9) . ‘-‘ . $option[‘name’] . ‘ ‘ . (utf8_strlen($value) > 20 ? utf8_substr($value, 0, 20) . ‘..’ : $value) . «n«;
  14.                         }

должна получится ссылка с данными

PHP:
  1. //подготовка запроса              
  2.         foreach ($param as $key => $value) {
  3.             $data .= «&».$key.«=».$value;
  4.         }
  5.        
  6.         //содержимое заказа
  7.         foreach ($product as $key => $value){
  8.             $data .= «&product[«.$key.«]=».$value.«»;
  9.             $data .= «&product_kol[«.$key.«]=».$product_kol[$key].«»;
  10.             if(isset($product_mod[$key])) {
  11.                 $data .= «&product_mod[«.$key.«]=».$product_mod[$key].«»;
  12.             }
  13.         }
  14.  
  15.         //отправка
  16.         $ch = curl_init();
  17.         curl_setopt($ch, CURLOPT_URL, «https://app.frontpad.ru/api/index.php?new_order»);
  18.         curl_setopt($ch, CURLOPT_FAILONERROR, 1);
  19.         curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
  20.         curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  21.         curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
  22.         curl_setopt($ch, CURLOPT_TIMEOUT, 30);
  23.         curl_setopt($ch, CURLOPT_POST, 1);
  24.         curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
  25.         $result = curl_exec($ch);
  26.         curl_close($ch);
 

romach

Смотрите, у вас происходит примерно вот так:

PHP:
  1. $rows = [1, 2, 3, 4, 5];
  2. foreach($rows as $row) {
  3.     $row++;
  4. }
  5. echo implode(‘,’, $rows); //1,2,3,4,5

Действия вроде есть, но они теряются, т.к. $row каждый раз пересоздается внутри цикла и к записям в массиве $rows отношения не имеет.

Другой пример:

PHP:
  1. $rows = [1, 2, 3, 4, 5];
  2. $items = [];
  3. foreach($rows as $row) {
  4.     $items[] = $row + 1;
  5. }
  6. echo implode(‘,’, $rows); // 1,2,3,4,5
  7. echo implode(‘,’, $items); // 2,3,4,5,6

Тут мы ввели дополнительный массив $items, в который сохраняли результат выполнения цикла для каждой записи.

Ещё пример:

PHP:
  1. $rows = [1, 2, 3, 4, 5];
  2. foreach($rows as &$row) { // sic!
  3.     $row++;
  4. }
  5. echo implode(‘,’, $rows); // 2,3,4,5,6

Тут &$row делает нам ссылку на конкретную запись в массиве, изменяя её мы изменяем само значение.

Далее, .= — это конкатенация, т.е. $a = 1; $b = 1; $a .= $b даст нам 11, а не 2. Если нужно сложить, то нужно использовать $a += $b.

В итоге, либо делаете $rows as &$product и добавляете / удаляете что вам нужно, либо создаете массив $products, туда складываете нужные значения и возвращаете уже его.

 

vadikvip777

что-то тип такого?)

PHP:
  1.         $product = [];
  2.         $product_kol = [];
  3.         $i=0;
  4.         foreach ($order_product_query->rows as $product) {
  5.             $product[$i] = $product[‘model’];
  6.             $product_kol[$i] = $product[‘quantity’];
  7.             $i++;
  8.         }
 

romach

Почти, только $products, потому что $product затрет цикл.

 

vadikvip777

Не работает :(

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *