foreach возвращается пустым - PullRequest
0 голосов
/ 24 сентября 2019

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

Во-первых, я получаю свои элементы следующим образом:

$items = Session::get('items');
$deco = json_decode($items, true);

Если яreturn $deco Я получаю это:

{
 "items":[
      {
        "id":1,
        "inventoryID":1,
        "title":"Product 1",
        "quantity":1,
        "unit_price":20,
        "image":"img.png"
      },

      {
        "id":2,
        "inventoryID":1,
        "title":"Product2",
        "quantity":1,
        "unit_price":25,
        "image":"img.png"
       }
    ]
}

Теперь в цикле (который я использую для изменения значений некоторых ключей для интеграции PayPal) у меня есть это:

$results = [];
    foreach($deco['items'] as $element) {

        $name=$element['title'];
        $quantity=$element['quantity'];
        $sku= $element['id'];
        $price=$element['unit_price'];


        $item = new Item();
        $item -> setName($name)
        ->setCurrency('USD')
        ->setQuantity($quantity)
        ->setSku($sku) 
        ->setPrice($price);

        $results[]=$item;
    }  

Если я возвращаю return $item (вне цикла), я получаю (как и ожидалось) только одно значение, а не всю коллекцию:

{
"name": "Product2",
"currency": "USD",
"quantity": 1,
"sku": 2,
"price": "25"
}

Но если я возвращаю return $results переменную, которую янужно, это дает мне это (он делает {} пунктов, как мне нужно, но возвращает пустое):

[
{},
{}
]

Thw весь код выглядит так:

public function test(){
    $items = Session::get('items');
    $deco = json_decode($items, true);
    $results = [];
    foreach($deco['items'] as $element) {

        $name=$element['title'];
        $quantity=$element['quantity'];
        $sku= $element['id'];
        $price=$element['unit_price'];


        $item = new Item();
        $item -> setName($name)
        ->setCurrency('USD')
        ->setQuantity($quantity)
        ->setSku($sku) 
        ->setPrice($price);

        $results[]=$item;
    }  
    return $results;
}

РЕДАКТИРОВАТЬ: Item.php модель на \vendor\paypal\rest-api-sdk-php\lib\PayPal\Api является PayPal по умолчанию:

class Item extends PayPalModel
{
/**
 * Stock keeping unit corresponding (SKU) to item.
 *
 * @param string $sku
 * 
 * @return $this
 */
public function setSku($sku)
{
    $this->sku = $sku;
    return $this;
}

/**
 * Stock keeping unit corresponding (SKU) to item.
 *
 * @return string
 */
public function getSku()
{
    return $this->sku;
}

/**
 * Item name. 127 characters max.
 *
 * @param string $name
 * 
 * @return $this
 */
public function setName($name)
{
    $this->name = $name;
    return $this;
}

/**
 * Item name. 127 characters max.
 *
 * @return string
 */
public function getName()
{
    return $this->name;
}

/**
 * Description of the item. Only supported when the `payment_method` is set to `paypal`.
 *
 * @param string $description
 * 
 * @return $this
 */
public function setDescription($description)
{
    $this->description = $description;
    return $this;
}

/**
 * Description of the item. Only supported when the `payment_method` is set to `paypal`.
 *
 * @return string
 */
public function getDescription()
{
    return $this->description;
}

/**
 * Number of a particular item. 10 characters max.
 *
 * @param string $quantity
 * 
 * @return $this
 */
public function setQuantity($quantity)
{
    $this->quantity = $quantity;
    return $this;
}

/**
 * Number of a particular item. 10 characters max.
 *
 * @return string
 */
public function getQuantity()
{
    return $this->quantity;
}

/**
 * Item cost. 10 characters max.
 *
 * @param string|double $price
 * 
 * @return $this
 */
public function setPrice($price)
{
    NumericValidator::validate($price, "Price");
    $price = FormatConverter::formatToPrice($price, $this->getCurrency());
    $this->price = $price;
    return $this;
}

/**
 * Item cost. 10 characters max.
 *
 * @return string
 */
public function getPrice()
{
    return $this->price;
}

/**
 * 3-letter [currency code](https://developer.paypal.com/docs/integration/direct/rest_api_payment_country_currency_support/).
 *
 * @param string $currency
 * 
 * @return $this
 */
public function setCurrency($currency)
{
    $this->currency = $currency;
    return $this;
}

/**
 * 3-letter [currency code](https://developer.paypal.com/docs/integration/direct/rest_api_payment_country_currency_support/).
 *
 * @return string
 */
public function getCurrency()
{
    return $this->currency;
}
//More similar stuff

Заранее спасибо

Ответы [ 3 ]

1 голос
/ 24 сентября 2019

Вы можете использовать ключ в foreach:

$results = [];
foreach($deco['items'] as $key=> $element) {

    $name=$element[$key]['title'];
    $quantity=$element[$key]['quantity'];
    $sku= $element[$key]['id'];
    $price=$element[$key]['unit_price'];


    $item = new Item();
    $item -> setName($name)
    ->setCurrency('USD')
    ->setQuantity($quantity)
    ->setSku($sku) 
    ->setPrice($price);

    $results[]=$item;
}  
0 голосов
/ 24 сентября 2019

Ответ (благодаря Ионике в сообществе разногласий по поводу разногласий):

    $items = Session::get('items');
    $deco = json_decode($items,true);
    $itemList = new ItemList();

foreach($deco['items'] as $element) {

    $item = new Item();
    $item->setName($element['title'])
        ->setCurrency('USD')
        ->setQuantity($element['quantity'])
        ->setSku($element['id']) 
        ->setPrice($element['unit_price']);

    $itemList->addItem($item);
}

$arr = $itemList->toArray();
return $arr;
0 голосов
/ 24 сентября 2019

Это происходит только из-за сериализации JMS.Я думаю, на уровне контроллера вам, возможно, придется проверить, были ли применены какие-либо группы сериализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...