【问题标题】:PHP: array_map to return specific array of objectsPHP:array_map 返回特定的对象数组
【发布时间】:2021-10-30 02:06:44
【问题描述】:

我在这里有一个codepen,它显示了大量的对象。我想从中提取特定属性并显示在控制台日志中,但在 PHP 中。

不幸的是,我对 PHP 很陌生,似乎无法弄清楚:

到目前为止我的尝试:

       $suppliersNotInDB = array_map(function ($order) {                                                                                                                                                 
            if (isset($order->items) && is_array($order->items)) {
                return array_map(function ($item) {
                    return [...$item];
                }, $order->items);
          }
       }, $ordersData);

据我所知,这还不是很接近,但我已经做了好几个小时了。任何帮助将不胜感激。

总而言之,我想在后端(Laravel)中执行这种过滤和排序,而不是前端,那里已经发生了太多事情。

【问题讨论】:

  • 您最终希望返回什么?你的问题没有说清楚
  • 如果您打开 codepen 并查看控制台日志,您将看到一个对象数组。这就是我需要的结果
  • Splat-packing 效率低且冗长。 stackoverflow.com/q/57725811/2943403您的示例输入和期望的结果是不清楚的。

标签: php laravel


【解决方案1】:

既然你使用的是 Laravel,那就开始使用Collections

如果我正确理解了您在 Javascript 示例中尝试执行的操作,则可以单行完成:

$suppliersNotInDB = collect($ordersData)
    ->pluck('items')
    ->flatten()
    ->pluck('supplier')
    ->unique()
    ->map(
        fn($supplier) => ['name' => $supplier, 'lowercased' => strtolower($supplier)]
    )
    ->values();

这可能可以进一步完善,只需快速记下它以重现您的结果。

这样的输出将是:

=> Illuminate\Support\Collection {#4999
     all: [
       [
         "name" => "Walmart",
         "lowercased" => "walmart",
       ],
       [
         "name" => "Bestbuy",
         "lowercased" => "bestbuy",
       ],
       [
         "name" => "TCI",
         "lowercased" => "tci",
       ],
       [
         "name" => "lkj",
         "lowercased" => "lkj",
       ],
       [
         "name" => "Thousand Needles",
         "lowercased" => "thousand needles",
       ],
     ],
   }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-01
    • 2021-07-28
    • 2018-12-11
    • 1970-01-01
    • 2021-10-17
    • 2016-09-16
    • 2019-09-01
    • 1970-01-01
    相关资源
    最近更新 更多