如果A键的值重复,则删除子数组

时间:2016-10-12 10:31:24

标签: php

如果找到特定键的重复值,我想从多维数组中删除子数组。 answer(s) here根本不起作用。但是,answer here适用于大量数组,速度相当慢。寻找更清洁,更快速的解决方案。

示例PHP数组

    $args = array();

    $args[] = array(
        'section' => array(
            'id' => 'section1',
            'name' => 'Section 1',
        ),
        'name' => 'Shortcode Name',
        'action' => 'shortcodeaction',
        'icon' => 'codeicon',
        'image' => 'codeimage',
    );
    $args[] = array(
        'section' => array(
            'id' => 'section2',
            'name' => 'Section 2',
        ),
        'name' => 'Shortcode2 Name',
        'action' => 'shortcodeaction2',
        'icon' => 'codeicon2',
        'image' => 'codeimage2',
    );
    $args[] = array(
        'section' => array(
            'id' => 'section3',
            'name' => 'Section 3',
        ),
        'name' => 'Shortcode3 Name',
        'action' => 'shortcodeaction3',
        'icon' => 'codeicon3',
        'image' => 'codeimage3',
    );
    $args[] = array(
        'section' => array(
            'id' => 'section1',
            'name' => 'Section 4',
        ),
        'name' => 'Shortcode4 Name',
        'action' => 'shortcodeaction4',
        'icon' => 'codeicon4',
        'image' => 'codeimage4',
    );
    $args[] = array(
        'section' => array(
            'id' => 'section5',
            'name' => 'Section 5',
        ),
        'name' => 'Shortcode5 Name',
        'action' => 'shortcodeaction5',
        'icon' => 'codeicon5',
        'image' => 'codeimage5',
    );

    $sections = array();

    foreach ( $args as $arg ) {
        $sections[] = $arg['section'];
    }  

而且,print_r($sections)结果。

Array
(
    [0] => Array
        (
            [id] => section1
            [name] => Section 1
        )

    [1] => Array
        (
            [id] => section2
            [name] => Section 2
        )

    [2] => Array
        (
            [id] => section3
            [name] => Section 3
        )

    [3] => Array
        (
            [id] => section1
            [name] => Section 4
        )

    [4] => Array
        (
            [id] => section5
            [name] => Section 5
        )

)

Array[0]Array[3]对于密钥id具有相同的值,因此在我的情况下必须删除整个Array[3]以避免重复。

这对我有用,但是当有100个或更多阵列时,它会变得非常慢。

    $knownIds = array();
    foreach( $sections AS $key=>$item ) {
      if( array_key_exists($item['id'], $knownIds) === true ) {
        unset( $sections[$key] );
      } else {
        $knownIds[$item['id']] = $key;
      }
    }
    $sections = array_values($sections);

在StackOverflow中尝试了几个答案(包括this),但在我的案例中没有一个有用。

由于

1 个答案:

答案 0 :(得分:1)

您可以使用array_columnarray_filter -

修改整体
//get all the sections value
$section = array_column($args, 'section');

//store ids in temp array
$idArray = array_unique(array_column($section, 'id'));
//filter the array having unique id
$uniqueSections = array_filter($section, function ($key, $value) use ($idArray) {
    return in_array($value, array_keys($idArray));
}, ARRAY_FILTER_USE_BOTH);

var_dump($uniqueSections);

对于PHP< 5.5

$section = array_map(function($args) {
             return $args['section'];
           }, $args);

$idArray = array_unique(array_map(function($section){return $section['id'];}, $section));