Добавьте к каждому элементу массива другой элемент php

#php #arrays #laravel #sorting #foreach

#php #массивы #laravel #сортировка #foreach

Вопрос:

У меня возникла еще одна проблема в логической области.

У меня есть массив, содержащий идентификаторы:

$product_ids = [‘1’, ‘5’, ‘3’]; <- Пример

Еще одна строка, которую я преобразую в массив, разделяя ее запятыми, чтобы указать количество продуктов, подлежащих изъятию. Например, для продукта 1 мне нужны 3 диска, поэтому мне нужно, чтобы элемент массива был «1,3».

$finalarray = [«1,3», «5,2», «3,10»];

Далее я указываю код, который выполняется в контроллере (где находится то, что я ранее рассказал):

 public function ordenform(Request $request)
{

    $input = $request->all();

    $request->validate([
        'nombre' => 'required|string',
        'apellido' => 'required|string',
        'productos' => 'required',
        'cantidades' => 'required|string',
        'enviosino' => 'required|in:si,no',
    ]);

    // Quantity Array
    $cantidades = explode(',', $input['cantidades']);
    if (count($cantidades) != count($input['productos'])) {
        return back()->withErrors(['Las cantidades no corresponden a los productos agregados']);
    }

    $total = 0;
    $ganancia = 0;

    foreach ($input['productos'] as $producto) {
        $producto = Product::find((int) $producto);
        $total  = $producto->value;
        $ganancia  = $producto->ganancia;
        $producto->stock = (int) $producto->stock - 1;
        $producto->save();
    }

    if ($input['enviosino'] == 'si') {
        $total  = (int) $input['envio'];
    }

    if ($input['envio'] == null) {
        $input['envio'] = 0;
    }

    // Products IDS Array
    $jsonproductos = json_encode($input['productos']);

    Order::create([
        'nombre' => $input['nombre'],
        'apellido' => $input['apellido'],
        'product_ids' => $finalprods,
        'value' => $total,
        'ganancia' => $ganancia,
        'envio' => $input['envio'],
    ]);

    $caja = Config::where('id', 1)->get()->first();
    $caja->dinerototal  = $total;
    $caja->gananciatotal  = $ganancia;
    $caja->save();

    return back()->with('success', 'Orden creada correctamente');
}
 

Наконец, мне нужно передать в качестве параметра создания конечный массив в столбец products_ids (позже я изменю имя).

Другой вариант, о котором я подумал, — это передача объектов в массив:

[{идентификатор: 1, количество: 3}]

Но я не знаю, как создать этот объект, я все еще новичок, хехе.

Надеюсь, я хорошо объяснился, английский не является моим родным языком. Мне очень жаль.

Я внимательно отношусь к вашим комментариям !! Приветствую вас.

PS: Я использую Laravel

Ответ №1:

Неважно, решено ->

         $prodsfinal = array();
    for ($i = 0; $i < sizeof($cantidades); $i  ) {
        $array = [
            'id' => json_decode($input['productos'][$i]),
            'cantidad' => (int) $cantidades[$i],
        ];
        array_push($prodsfinal, $array);
    }
 

Ответ №2:

Для достижения [{id: 1, quantity: 3}] этого будет несколько идей, но, похоже, это ArrayList, поэтому ниже показано, как вы можете создать ArrayList в PHP. Я не тестировал код, только что написанный здесь, но должен дать вам идею для достижения этой цели.

Я рассматриваю один из них — класс Order .

  <?php
class Order {
        private $id;
        private $quantity;
    
        public function setId(int $id) {
            $this->id = $id;
            return $this;
        }
    
        public function getId(){
            return $this->id;
        }
    
        public function setQuantity(int $quantity) {
            $this->quantity  = $quantity;
            return $this;
        }
    
        public function getQuantity(){
            return $this-> quantity;
        }
    
        public function toArray(){
           return [
               'id' => $this->getId(),
               'quantity' => $this->getQuantity()
           ];
        }
    }
?>
 

другой элемент — orderList .

 <?php
class OrderList {
       private $orderList;
    
       public function __construct(Order ...$orders) {
            $this->orderList = $orders;
       }
     
       public function toArray(){
          $arr = [];
          foreach ($this->orderList as $order) {
            $arr[] = $order->toArray();
          }
          return $arr;
       }
    }
?>
 

а затем используйте, как

 $order1 = new Order();
$order1 = $order1->setId(1)->setQuantity(10);
$order2 = new Order();
$order2 = $order1->setId(2)->setQuantity(20);
    
$orderList = new OrderList($order1, $order2);
var_dump(json_encode($orderList->toArray()));
 

//Вывод

 string(47) "[{"id":2,"quantity":20},{"id":2,"quantity":20}]"
 

Вам не нужен json_encode, я добавил его только для печати.