具有相同键的 PHP marge 数组 评论后编辑

如何解决具有相同键的 PHP marge 数组 评论后编辑

我需要在 woocommerce 中对我的产品属性的数据结构进行排序,对每个属性及其值进行分组。

我现在的数组

array (size=5)
  0 => 
    array (size=1)
      'pa_color' => 
        array (size=1)
          0 => string 'red' (length=3)
  1 => 
    array (size=1)
      'pa_color' => 
        array (size=1)
          0 => string 'red' (length=3)
  2 => 
    array (size=2)
      'pa_color' => 
        array (size=1)
          0 => string 'gray' (length=4)
      'pa_modello' => 
        array (size=1)
          0 => string 'modello2' (length=8)
  3 => 
    array (size=1)
      'pa_color' => 
        array (size=1)
          0 => string 'yellow' (length=6)
  4 => 
    array (size=0)
      empty

我需要合并如下内容:

array (size=1)
      'pa_color' => 
        array (size=1)
          0 => string 'red' (length=3)
          1 => string 'gray' (length=4)
          2 => string 'yellow' (length=6)
       
       'pa_modello' => 
            array (size=1)
              0 => string 'modello2' (length=8)

将相同键的值分组在一个数组中。

提前致谢

解决方法

$array 是你的数组:

foreach ($array as $item)
{
   if ($item['pa_color']['0']) $color[ $item['pa_color']['0'] ] = $item['pa_color']['0'];
   if ($item['pa_modello']['0']) $modello[$item['pa_modello']['0']] = $item['pa_modello']['0'];
// this loop will remove the duplicated values and I Assume each pa_color,pa_modello in the original array contains only one element with 0 as a key
}
foreach ($color as $c) $newArray['pa_color'][] = $c;
foreach ($modello as $m) $newArray['pa_modello'][] = $m;

这应该可以完成工作。

编辑:

对于动态属性注释:

foreach ($array as $item)
   foreach (array_keys($item) as $key) // getting the keys ex: pa_color 
   {
      if ($item[$key]['0']) {
         $temparray[$key][ $item[$key]['0'] ] = $item[$key]['0'];
      }
      // this loop will remove the duplicated values and I Assume each key in the original array contains only one element with 0 as a key
// the temparray will contain in its keys ($key) the pa_color,pa_module.. etc 
// each of them will be an array with the key=value approach .. in case having two "red" it will not duplicate 
   }
// finally making it zero based array 
foreach ($temparray as $key=>$item) // ex: $temparray['pa_color']['red'] = 'red'
   foreach ($item as $value) // ex: $item['red'] = 'red'
      $newArray[$key][] = $value; // ex: $newArray['pa_color'][0] = 'red';

看起来很复杂..我找不到更好的方法。

,
global $wp_query;
    $obj = get_queried_object();
    foreach ($wp_query->posts as $_post) {

        $_product = wc_get_product($_post->ID);
        $wc_attr_objs = $_product->get_attributes();
        $prod_attrs = [];

        foreach ($wc_attr_objs as $wc_attr => $wc_term_objs) {
            $prod_attrs[$wc_attr] = [];

            $wc_terms = $wc_term_objs->get_terms();


            foreach ($wc_terms as $wc_term) {
                 array_push($prod_attrs[$wc_attr],$wc_term->slug);


                var_dump($prod_attrs);


             }
        }

      $totals[] = $prod_attrs;

    } 
,

遍历第一级条目,然后添加一个嵌套循环,以从子数组中的所需键和值创建变量。

因为最深的子数组中只有一个元素,所以您可以use "array destructuring" inside of the nested loop将唯一元素的值分配为$value

通过将 $value 声明为结果数组中深层值的键,确保输出中的值唯一。

如果您真的希望子数组被重新索引,您可以使用 array_map()array_values() -- 但仅在必要时才这样做。

代码:(Demo)

$result = [];
foreach ($array as $entries) {
    foreach ($entries as $key => [$value]) {
        $result[$key][$value] = $value;
    }
}

var_export($result);

输出:

array (
  'pa_color' => 
  array (
    'red' => 'red','gray' => 'gray','yellow' => 'yellow',),'pa_modello' => 
  array (
    'modello2' => 'modello2',)

附言如果您的深层子数组可能有多个元素,那么只需用另一个循环来适应它以迭代该级别。

$result = [];
foreach ($array as $entries) {
    foreach ($entries as $key => $values) {
        foreach ($values as $value) {
            $result[$key][$value] = $value;
        }
    }
}

翻译成您在自我回答帖子中编写的代码,我认为它可能如下所示:

global $wp_query;
$prod_attrs = [];
foreach ($wp_query->posts as $_post) {
    foreach (wc_get_product($_post->ID)->get_attributes() as $wc_attr => $wc_term_objs) {
        foreach ($wc_term_objs->get_terms() as $wc_term) {
             $prod_attrs[$wc_attr][$wc_term->slug] = $wc_term->slug;
         }
    }
}
var_export($prod_attr);
,

组合数组的最简单方法是在数组数组上使用 array_merge_recursive 和 splat 运算符 (...)。

splat 运算符将解包可用于递归合并它们的数组。

$expected = array_merge_recursive(...$array);

此外,如果您只需要合并数组中的唯一值,您可以像这样使用 array_map

$unique = array_map('array_unique',$expected);

more about splat operator

评论后编辑

因为我自己一直在大量使用这种方法,所以我做了一些测试,看看哪个更快。

分享结果:

问题:两种方法哪个更快?

方法一:array_map('array_unique',array_merge_recursive(...$array));
方法 2:使用 foreach,如 mickmackusa 的回答中所述

使用大小为 5、50、100 和 500 的数组进行测试
将每个函数循环 10000 次和 100000 次。

T1 是 array_merge_recursive 所用的时间,T2 是 foreach} 所用的时间

array_size loop_count T1 T2 更快 差异
5 10,000 0.041 0.0206 foreach 0.0204
5 100,000 0.2061 0.2082 array_merge_recursive 0.002
5 500,000 1.0315 1.0611 array_merge_recursive 0.0296
50 10,000 0.046 0.1878 array_merge_recursive 0.1418
50 100,000 0.4452 1.8877 array_merge_recursive 1.4425
100 10,000 0.0697 0.3729 array_merge_recursive 0.3032
100 100,000 0.6795 3.7464 array_merge_recursive 3.0669
500 10,000 0.2542 1.8674 array_merge_recursive 1.6132
500 100,000 2.5359 18.6922 array_merge_recursive 16.1562

结论:

  1. 对于小型阵列,使用什么并不重要。我注意到只有在 500,000 次循环后才有所不同
  2. 不同之处在于当您使用更大的数组时。使用计数为 500 foreach 的数组时需要多 16.1562 秒

因此,如果您有较小的数组,请使用任何您想要的。对于更大的数组,绝对避免 foreach 并使用 array_merge_recursive

链接到 test sandbox

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)> insert overwrite table dwd_trade_cart_add_inc > select data.id, > data.user_id, > data.course_id, > date_format(
错误1 hive (edu)> insert into huanhuan values(1,'haoge'); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive> show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 <configuration> <property> <name>yarn.nodemanager.res