首页 > 解决方案 > 通过多个值在多维数组中搜索

问题描述

我有一个数组,我确定其中有一些重复值,我想在这个数组中搜索并找到重复值并返回该数组的键。

让我用一个例子来解释一下,这是我的数组:

[
  0 => [
      'name' => 'name0',
      'family' => 'family0',
      'email' => 'email0@sample.com',
      'rate' => 10
  ],
  1 => [
      'name' => 'name1',
      'family' => 'family1',
      'email' => 'email1@sample.com',
      'rate' => 4
  ],
  2 => [
      'name' => 'name0',
      'family' => 'family0',
      'email' => 'email0@sample.com',
      'rate' => 6
  ]
];

现在,我想同时在这个数组中搜索name, family,email并返回父项的键(在本例中为 0 和 2)。因为我想创建一个这样的新数组:

[
  0 => [
      'name' => 'name0',
      'family' => 'family0',
      'email' => 'email0@sample.com',
      'rate' => [
          10,
          6
      ]
  ],
  1 => [
      'name' => 'name1',
      'family' => 'family1',
      'email' => 'email1@sample.com',
      'rate' => [
          4
      ]
  ],
];

我怎样才能在 PHP 中做到这一点?

标签: phparrays

解决方案


您可以使用array-reduce并将 3 个相似的字段用作键。

定义一个创建密钥并设置或添加速率的函数:

function combineRate($carry, $item) {
    $k = implode('###', array($item['name'], $item['family'], $item['email']));
    if (isset($carry[$k]))
        $carry[$k]['rate'][] = $item['rate'];
    else {
        $item['rate'] = [$item['rate']];
        $carry[$k] = $item;
    }
    return $carry;
}

用空数组调用它:

$res = array_values(array_reduce($a, 'combineRate', array()));

现场示例:3v4l


推荐阅读