PHP 二维数组查找2个以上相同字段

$provinces = [
    [
        'id'     => 1,
        'name'   => '张三',
        'city'   => '湖南'
    ],[
        'id'     => 2,
        'name'   => '李四',
        'city'   => '河北'
    ],[
        'id'     => 3,
        'name'   => '张三',
        'city'   => '湖北'
    ],[
        'id'     => 4,
        'name'   => '王五',
        'city'   => '北京'
    ],[
        'id'     => 5,
        'name'   => '王五',
        'city'   => '北京'
    ],
];
// 按拼音分组
$groupProvinces = [];
foreach ($provinces as $key => $value) {
    $groupProvinces[$value['name']][] = $value;
}
// 获取重复的的拼音
$repeats = [];
foreach ($groupProvinces as $key => $value) {
    if (count($value) > 1) {
        $repeats[$key] = $value;
    }
}
echo '<pre>';
echo print_r($repeats);

比如这样只能找到name相同的。假如我想得到name且city都相同的2条以上,算法如何呢?谢谢大神

阅读 2.5k
1 个回答
<?php
$provinces = [
    [
        'id'   => 1,
        'name' => '张三',
        'city' => '湖南'
    ], [
        'id'   => 2,
        'name' => '李四',
        'city' => '河北'
    ], [
        'id'   => 3,
        'name' => '张三',
        'city' => '湖北'
    ], [
        'id'   => 4,
        'name' => '王五',
        'city' => '北京'
    ], [
        'id'   => 5,
        'name' => '王五',
        'city' => '北京'
    ],
];
$temp = [];
foreach ($provinces as $province) {
    $temp[$province['name'] . '|' . $province['city']][] = $province;
}
$result = array_values(array_filter($temp, function ($item) {
    return count($item) >= 2;
}));

var_dump($result);

再补充一个效率高一点儿的。

<?php
$provinces = [
    [
        'id'   => 1,
        'name' => '张三',
        'city' => '湖南'
    ], [
        'id'   => 2,
        'name' => '李四',
        'city' => '河北'
    ], [
        'id'   => 2,
        'name' => '李四',
        'city' => '河北'
    ], [
        'id'   => 3,
        'name' => '张三',
        'city' => '湖北'
    ], [
        'id'   => 4,
        'name' => '王五',
        'city' => '北京'
    ], [
        'id'   => 5,
        'name' => '王五',
        'city' => '北京'
    ], [
        'id'   => 2,
        'name' => '李四',
        'city' => '河北'
    ],
];
$temp = [];
$result = [];
foreach ($provinces as $province) {
    $onlyKey = $province['name'] . '|' . $province['city'];
    $tempKey = &$temp[$onlyKey];
    $tempKey[] = $province;
    if (count($tempKey) >= 2) {
        $result[$onlyKey] = $tempKey;
    }
}
unset($temp, $province, $tempKey);
var_dump(array_values($result));
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题