【问题标题】:PHP. Map two arrays using the attribute of one against the key of the secondphp。使用一个的属性与第二个的键映射两个数组
【发布时间】: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结束,则没有添加新字段。

我的问题是:

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

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

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

【问题讨论】:

    标签: php arrays mapping


    【解决方案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) 。我把它拿走了它不起作用。
    • 我添加了更多解释 - 它称为引用,它允许您修改原始对象而不是副本。 stackoverflow.com/questions/25835856/… 有更多解释。
    • 还有一个问题,数组的最后一个元素是这样的:7 => & array:18。有什么办法可以去掉那个“&”符号?
    猜你喜欢
    • 2020-05-13
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    • 2018-02-22
    • 1970-01-01
    • 2015-08-09
    • 2012-06-03
    相关资源
    最近更新 更多