php。使用一个的属性与第二个的键映射两个数组

Posted

技术标签:

【中文标题】php。使用一个的属性与第二个的键映射两个数组【英文标题】:PHP. Map two arrays using the attribute of one against the key of the second 【发布时间】:2020-03-20 01:33:19 【问题描述】:

我有两个数组:

第一个看起来像这样:

   Array: 8 [▼
      0 => array:17 [▼
        "id" => 4
        "firstname" => "Maria"
        "lastname" => "von Moszczenski"
        "slug" => "marianne-von-moszczenski"
        "email" => "marianne.von.moszczenski@gmail.com"
        "email_verified_at" => null
        "created_at" => "2019-11-21 17:34:53"
        "updated_at" => "2019-11-21 17:34:53"
        "deleted_at" => null
      ]
        1 => User ...
        2 => User ...
        3 => User ...
        ... unknown number of elements
     ]

第二个数组如下所示:

array:8 [▼
  "Maria" => 17
  "Stefanie" => 2
  "Angela" => 3
  "Andrea" => 4
  "Michelle" => 5
  "Yvonne" => 6
  "Martina" => 7
  "Karolina" => 8
  ... unknown number of elements...
]

我想合并它们,所以我得到以下结构:

Array: 8 [▼
  0 => array:17 [▼
    "id" => 4
    "firstname" => "Maria"
    "lastname" => "von Moszczenski"
    "slug" => "marianne-von-moszczenski"
    "email" => "marianne.von.moszczenski@gmail.com"
    "email_verified_at" => null
    "created_at" => "2019-11-21 17:34:53"
    "updated_at" => "2019-11-21 17:34:53"
    "deleted_at" => null
    "total" => 17  // <------ this is the new field
    ... unknown number of elements...
  ]
    1 => User ...
    2 => User ...
    3 => User ...
 ]

所以我这样做了:

 foreach ($totalsPerEmployee as $key => $total) 
    foreach ($users as $user)  
        if ($user['firstname'] === $key) 
            $user['totalappointments'] = $total;  // if I stop and echo hier I see the new field
        
    

如果我在中间回显foreach的结果,我看到添加了新字段,但是一旦两个foreach结束,则没有添加新字段。

我的问题是:

这种方法看起来容易出错,或者如果数组变得太大可能会导致性能问题。

是否有任何其他方式来映射/组合/相交或这两个数组将第一个中的一个属性(名字)映射到第二个的键?

如果没有任何“魔术”方法,我必须进行两个循环。我做错了什么?

【问题讨论】:

【参考方案1】:

你可以循环循环,你已经有了用户名索引的总计数组,所以只需循环用户数组,如果有值,然后将其添加到...

foreach ($users as &$user) 
    if (isset($totalsPerEmployee[$user['firstname']])) 
        $user['totalappointments'] = $totalsPerEmployee[$user['firstname']];
    

unset($user);

还要确保您更新原始数组,使用&amp;$user 使用对数据的引用,否则您(如您所见)更新数据的副本。只是为了确保 - 在循环之后使用 unset($user) 以防万一。

【讨论】:

感谢您的回答。它有效,你能解释一下foreach中的“&”吗? ->foreach ($users as &$user) 。我把它拿走了它不起作用。 我添加了更多解释 - 它称为引用,它允许您修改原始对象而不是副本。 ***.com/questions/25835856/… 有更多解释。 还有一个问题,数组的最后一个元素是这样的:7 => & array:18。有什么办法可以去掉那个“&”符号?

以上是关于php。使用一个的属性与第二个的键映射两个数组的主要内容,如果未能解决你的问题,请参考以下文章

与第一个对象进行比较时,如何获取第二个对象数组的所有属性?

在prolog中将两个列表映射在一起

bzoj4641基因改造 特殊匹配条件的KMP

如何根据相同的键名在枚举之间进行映射?

Hibernate多表关系配置——多对多对关系映射

RestKit 2.0:映射-非唯一时的第二个实体为零