#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, я добавил его только для печати.