我有2个数据数组,我需要将这两个数组的结果相加。
我可以使用array_combine
,但是有两个问题:
这里的问题是我的第一个数组具有(例如)3个值,而我的第二个数组具有7个值
这种组合将返回以下错误:
array_combine(): Both parameters should have an equal number of elements
这是我的dd结果:
"optionID" => array:3 [▼ //check-box values
0 => "1"
1 => "2"
2 => "11"
]
"optionPRICE" => array:8 [▼ //input values
0 => "98"
1 => null
2 => null
3 => null
4 => null
5 => null
6 => null
7 => null
]
我正在寻找的是从选中的复选框中获取输入值,而不是其余部分。
示例我检查数据1,2,3,我得到的值1,2,3是否是null
的{{1}},而没有得到dd数据中的4,5,6,7以上。
这是我的html的样子
filled
我正在获取这2种类型的数据
<tr>
<td class="text-center" width="50">
<label class="switch switch-small">
<input type="checkbox" name="optionID[]" value="11"> //checkbox arrays
<span></span>
</label>
</td>
<td>
CDN
</td>
<td class="text-center">
//input arrays
<input class="form-control" type="number" name="optionPRICE[]">
</td>
</tr>
this
"optionID" => array:3 [▼ //check-box values
0 => "1"
1 => "2"
2 => "11"
]
"optionPRICE" => array:8 [▼ //input values
0 => "98"
1 => null
2 => null
]
or this
有什么主意吗?
根据答案,如果我使用映射函数返回数据是我的第二个示例期望,那么将其命名为数据并将它们与我的模型列相关联会造成混淆,因此我共享我的模型名称并解释哪些数据必须放在哪个列中为了保存在正确的位置。
"optionID" => array:3 [▼
"array" => array:2 [
0 => "1",
1 => "98",
],
"array" => array:2 [
0 => "2",
1 => null,
],
"array" => array:2[
0 => "11",
1 => null,
],
]
Schema
Schema::create('product_options', function (Blueprint $table) {
$table->increments('id');
$table->integer('product_id')->nullable()->unsigned();
$table->foreign('product_id')->references('id')->on('products')->onDelete('cascade');
$table->integer('option_id')->nullable()->unsigned();
$table->foreign('option_id')->references('id')->on('options')->onDelete('cascade');
$table->string('price')->nullable();
});
数据必须进入optionID
列,而option_id
数据必须进入optionPRICE
列。
对于product_id列,因为此数据将在保存我的产品后保存,因此我只需通过price
即可获得该列已存在的ID。
我尝试了许多不同的条件,以根据我得到的答案来看数据如何在这里发送是一个严重的问题。
当我从1个选定的选项传递数据时,$product->id
选择颜色并填充一些数据以按预期方式发送。
但是当我选择第二个选项e.g.
时选择此选项的 sizes ,只有复选框ID会发送,而e.g.
的数据不会发送,此问题适用于下一个选项,因为好(选项3,4,5,6 ....)
以下是示例:
optionPRICE
好的,我变通了,测试了一些解决问题的方法,这就是我所想的和所取得的成就:
array:3 [▼
0 => array:3 [▼ //this is from colors (included price)
"option_id" => "4"
"price" => "768"
"product_id" => 50
]
1 => array:3 [▼ //this is also from colors (included price)
"option_id" => "5"
"price" => "5467"
"product_id" => 50
]
2 => array:3 [▼ //this one is from sizes (not included price, while i filled the price!)
"option_id" => "10"
"price" => null
"product_id" => 50
]
]
字段,而不是通过对它们进行计数,而是使用值。这是我到目前为止所做的:
optionPRICE
上面的代码返回以下内容:
$options = $request->input('optionID');
$prices = $request->input('optionPRICE');
$collection = array_filter($prices, function($value) {
return !is_null($value);
});
$toInsert = array_merge([$options, $collection]);
dd($toInsert);
但是如果我仅填写我的两个复选框的价格,就会像这样:
array:2 [▼
0 => array:3 [▼
0 => "4"
1 => "5"
2 => "10"
]
1 => array:3 [▼
0 => "768"
1 => "5467"
5 => "5465496"
]
]
这很好,仅获取输入数据,而无需仅对数组元素进行纯值计数。
此后,我需要加入我的2个数组,并在发生第二种情况(3个复选框,2个价格)的情况下返回null。
有什么帮助吗?
答案 0 :(得分:0)
这应该使用array_slice
为您提供第一个所需的解决方案:
// Get the length of the smaller array
$minLength = min(count($arr1), count($arr2));
$result = [
'optionID' => array_slice($arr1, 0, $minLength),
'optionPRICE' => array_slice($arr2, 0, $minLength),
];
答案 1 :(得分:0)
对于第二个理想的解决方案,您可以尝试执行以下操作(如果我理解正确的话):
$checkboxes = [1, 2, 11];
$inputs = [98, null, null];
$result = collect($checkboxes)->map(function ($item, $key) use($inputs) {
return [$item, $inputs[$key] ?? null];
})->toArray();
dd($result);
// array:3 [
// 0 => array:2 [
// 0 => 1
// 1 => 98
// ]
// 1 => array:2 [
// 0 => 2
// 1 => null
// ]
// 2 => array:2 [
// 0 => 11
// 1 => null
// ]
// ]