【问题标题】:Laravel 5.1 - Combining arrays from inputLaravel 5.1 - 从输入组合数组
【发布时间】:2015-11-16 10:27:42
【问题描述】:

我有一个创建 3 个数组的订单:

  • 产品 ID
  • 数量
  • 行总计(数量 x 产品价格)

我在 Product 和 Sale 之间有一个名为 Product_Sale 的数据透视表,其中还包含列数量和 line_total。

我要努力工作的第一件事是将所有三个数组组合成一个合理的单个数组。以下是我目前拥有的:

    $keys = $request->product_id;
    $quantities = $request->quantity;
    $line_totals = $request->line_total;

    $order = array();

    foreach ($keys as $key => $id) {
            $order[$key] = array(
                'quantity'  => $quantities[$id],
                'line_total' => $line_totals[$id]
            );
    }

    print_r ($order);

我在这里得到一个错误:未定义的偏移量:53

非常感谢任何帮助 - 谢谢!

===更新:

数组的var_dump:

PRODUCT IDS
array (size=51)
  10 => string '10' (length=2)
  5 => string '5' (length=1)
  53 => string '53' (length=2)
  15 => string '15' (length=2)
  19 => string '19' (length=2)
  39 => string '39' (length=2)
  27 => string '27' (length=2)
  29 => string '29' (length=2)
  48 => string '48' (length=2)
  30 => string '30' (length=2)
  23 => string '23' (length=2)
  43 => string '43' (length=2)
  16 => string '16' (length=2)
  14 => string '14' (length=2)
  36 => string '36' (length=2)
  51 => string '51' (length=2)
  8 => string '8' (length=1)
  25 => string '25' (length=2)
  28 => string '28' (length=2)
  24 => string '24' (length=2)
  22 => string '22' (length=2)
  38 => string '38' (length=2)
  26 => string '26' (length=2)
  49 => string '49' (length=2)
  41 => string '41' (length=2)
  12 => string '12' (length=2)
  31 => string '31' (length=2)
  20 => string '20' (length=2)
  4 => string '4' (length=1)
  6 => string '6' (length=1)
  17 => string '17' (length=2)
  47 => string '47' (length=2)
  44 => string '44' (length=2)
  50 => string '50' (length=2)
  34 => string '34' (length=2)
  7 => string '7' (length=1)
  35 => string '35' (length=2)
  46 => string '46' (length=2)
  40 => string '40' (length=2)
  11 => string '11' (length=2)
  33 => string '33' (length=2)
  21 => string '21' (length=2)
  45 => string '45' (length=2)
  18 => string '18' (length=2)
  42 => string '42' (length=2)
  52 => string '52' (length=2)
  37 => string '37' (length=2)
  32 => string '32' (length=2)
  3 => string '3' (length=1)
  9 => string '9' (length=1)
  13 => string '13' (length=2)

QUANTITIES
array (size=51)
  0 => string '0' (length=1)
  1 => string '0' (length=1)
  2 => string '0' (length=1)
  3 => string '0' (length=1)
  4 => string '0' (length=1)
  5 => string '0' (length=1)
  6 => string '0' (length=1)
  7 => string '0' (length=1)
  8 => string '0' (length=1)
  9 => string '2' (length=1)
  10 => string '2' (length=1)
  11 => string '0' (length=1)
  12 => string '0' (length=1)
  13 => string '0' (length=1)
  14 => string '0' (length=1)
  15 => string '0' (length=1)
  16 => string '0' (length=1)
  17 => string '0' (length=1)
  18 => string '0' (length=1)
  19 => string '0' (length=1)
  20 => string '0' (length=1)
  21 => string '0' (length=1)
  22 => string '0' (length=1)
  23 => string '0' (length=1)
  24 => string '0' (length=1)
  25 => string '0' (length=1)
  26 => string '0' (length=1)
  27 => string '0' (length=1)
  28 => string '0' (length=1)
  29 => string '0' (length=1)
  30 => string '0' (length=1)
  31 => string '0' (length=1)
  32 => string '0' (length=1)
  33 => string '0' (length=1)
  34 => string '0' (length=1)
  35 => string '0' (length=1)
  36 => string '0' (length=1)
  37 => string '0' (length=1)
  38 => string '0' (length=1)
  39 => string '0' (length=1)
  40 => string '0' (length=1)
  41 => string '0' (length=1)
  42 => string '0' (length=1)
  43 => string '0' (length=1)
  44 => string '0' (length=1)
  45 => string '0' (length=1)
  46 => string '0' (length=1)
  47 => string '0' (length=1)
  48 => string '1' (length=1)
  49 => string '0' (length=1)
  50 => string '0' (length=1)

LINE TOTALS
array (size=51)
  0 => string '0.00' (length=4)
  1 => string '0.00' (length=4)
  2 => string '0.00' (length=4)
  3 => string '0.00' (length=4)
  4 => string '0.00' (length=4)
  5 => string '0.00' (length=4)
  6 => string '0.00' (length=4)
  7 => string '0.00' (length=4)
  8 => string '0.00' (length=4)
  9 => string '38.00' (length=5)
  10 => string '42.00' (length=5)
  11 => string '0.00' (length=4)
  12 => string '0.00' (length=4)
  13 => string '0.00' (length=4)
  14 => string '0.00' (length=4)
  15 => string '0.00' (length=4)
  16 => string '0.00' (length=4)
  17 => string '0.00' (length=4)
  18 => string '0.00' (length=4)
  19 => string '0.00' (length=4)
  20 => string '0.00' (length=4)
  21 => string '0.00' (length=4)
  22 => string '0.00' (length=4)
  23 => string '0.00' (length=4)
  24 => string '0.00' (length=4)
  25 => string '0.00' (length=4)
  26 => string '0.00' (length=4)
  27 => string '0.00' (length=4)
  28 => string '0.00' (length=4)
  29 => string '0.00' (length=4)
  30 => string '0.00' (length=4)
  31 => string '0.00' (length=4)
  32 => string '0.00' (length=4)
  33 => string '0.00' (length=4)
  34 => string '0.00' (length=4)
  35 => string '0.00' (length=4)
  36 => string '0.00' (length=4)
  37 => string '0.00' (length=4)
  38 => string '0.00' (length=4)
  39 => string '0.00' (length=4)
  40 => string '0.00' (length=4)
  41 => string '0.00' (length=4)
  42 => string '0.00' (length=4)
  43 => string '0.00' (length=4)
  44 => string '0.00' (length=4)
  45 => string '0.00' (length=4)
  46 => string '0.00' (length=4)
  47 => string '0.00' (length=4)
  48 => string '11.00' (length=5)
  49 => string '0.00' (length=4)
  50 => string '0.00' (length=4)

【问题讨论】:

  • 如果你告诉我们 eloquent 的合适格式是什么:你会得到更多可以帮助你的人。
  • 另外你制作的数组有什么问题?
  • @RiggsFolly - 已编辑问题。目前不要太担心 Eloquent 附加,我认为一旦采用正确的格式,这将很简单。谢谢。
  • 您似乎正试图从不存在的数量或 line_totals 中获取值。尝试 var_dump 你所有的数组并比较他们的键
  • @mdamia line_totals 数量的一些值将不存在,因为它们为零(请参阅问题,使用 var_dump 更新)。

标签: php arrays laravel eloquent laravel-5.1


【解决方案1】:

必须检查产品 id 是否存在于数量或行总数中

$keys = $request->product_id;
$quantities = $request->quantity;
$line_totals = $request->line_total;

$order = array();

foreach ($keys as $key => $id) {
   if( in_array($key,$quantities)  && in_array($key,$line_totals) ) {

        $order[$key] = array(
            'quantity'  => $quantities[$key],
            'line_total' => $line_totals[$key]
        );
   }
}

print_r ($order);

【讨论】:

  • 接近了!但是——“间接修改重载属性 Illuminate\Http\Request::$product_id 没有效果”
  • 很高兴我能以某种方式提供帮助。斯文成功了,我更新了我的答案。
【解决方案2】:

好的,我注意到您的代码中的一些内容..

首先,产品 ids 数组包含每个项目的匹配键值。这表明$key$id 是由同一来源制成的,并且是同一事物。在这种情况下,您可以从 foreach 中删除您的键值。保存一些代码并使其更清晰。 还要尝试使用好的变量名; $request->product_id 是单数,但它以数组的形式返回多个。更好的可以叫它$request->product_ids$order = array(); 也是如此。

此外,我看到产品 ids 数组没有其他两个数组中列出的所有键。在这种情况下,如果找不到该密钥,您的代码总是会崩溃。最好在为变量赋值之前使用一些检查。

这是一种分配值的保存方法:

$keys        = $request->product_id;
$quantities  = $request->quantity;
$line_totals = $request->line_total;

$orders = [];

foreach($keys as $key => $id) 
{
    // do we have all the data?
    if( !isset($quantities[ $id ]) || !isset($line_totals[ $id ]) )
    { // nopes.
        // log error or someting about missing key..

        continue; // skip this 'bad' one and try the next.
    }

    // we have all the data, save the order.
    $orders[ $key ] = [
        'quantity'   => $quantities[ $id ],
        'line_total' => $line_totals[ $id ]
    ];
}

希望这会有所帮助!

【讨论】:

  • 关于键的好点,我更新了我的答案,改用in_array
猜你喜欢
  • 2021-07-25
  • 1970-01-01
  • 2013-11-18
  • 1970-01-01
  • 2015-11-07
  • 2017-11-13
  • 2014-09-20
  • 1970-01-01
相关资源
最近更新 更多