选择数组内(另一个数组内)包含相同值的所有键

时间:2018-08-29 21:01:43

标签: php arrays

我的意思是,在许多数组(例如数组21、23和24)中,某些值为“ nit”的键具有相同的值。我想选择所有具有相同“ nit”的数组,并使用所有这些创建一个新数组。我需要一个数组(从所有具有相同“ nit”的数组中)保留在主数组中(随机选择一个)。

[20] => Array
            (
                [fecha] => 2018-08-27 18:38:49
                [id_cliente] => 
                [nit] => 50255872726
                [destino] => Copartes.Gt
                [nombre] => Registrar Cliente
                [telefono] => 55872726
                [type] => IN
                [mensaje] => Mandame el número de cuenta y te voy a depositar
            )

        [21] => Array
            (
                [fecha] => 2018-08-27 18:36:20
                [id_cliente] => 110099
                [nit] => 3108449-4
                [destino] => Copartes.Gt
                [nombre] => Guillermo Suhr
                [telefono] => 42150465
                [type] => IN
                [mensaje] => Muchas gracias
            )

        [22] => Array
            (
                [fecha] => 2018-08-27 18:30:05
                [id_cliente] => 27523
                [nit] => 1241764-5
                [destino] => Copartes.Gt
                [nombre] => Manuel Garcia
                [telefono] => 53186931
                [type] => IN
                [mensaje] => Gracias
            )

        [23] => Array
            (
                [fecha] => 2018-08-27 18:30:00
                [id_cliente] => 110099
                [nit] => 3108449-4
                [destino] => Copartes.Gt
                [nombre] => Guillermo Suhr
                [telefono] => 42150465
                [type] => IN
                [mensaje] => Gracias
            )

        [24] => Array
            (
                [fecha] => 2018-08-27 18:30:00
                [id_cliente] => 110099
                [nit] => 3108449-4
                [destino] => Copartes.Gt
                [nombre] => Guillermo Suhr
                [telefono] => 42150465
                [type] => IN
                [mensaje] => Buena tarde

2 个答案:

答案 0 :(得分:1)

filter个数组:

$a = array_filter($a, function($val) {
    static $set = []; // collect nits
    $nit = $val['nit'];
    if (!isset($set[$nit])) { // new nit
        return $set[$nit] = true; // true
    }
    return false;
});

说明: 过滤器回调是为每个数组元素调用的函数。 (因为没有传递给array_filter()的标志,所以回调仅接收数组值。)此函数有一个static variable,它仅存在于函数范围内,并且在函数作用时不会丢失它的值通话已完成。它会收集到目前为止的所有尼特值,如果是首次出现,则返回true,否则返回false

答案 1 :(得分:0)

我总是发现最容易做的事情是一个简单的foreach循环,将您的项目排序到另一个按您希望的键分组的数组中,在我的简化示例中,我使用了category ...

// Source Data
$array = array(
  array( 'category' => 10, 'name' => 'aaa' ),
  array( 'category' => 11, 'name' => 'bbb' ),
  array( 'category' => 12, 'name' => 'ccc' ),
  array( 'category' => 10, 'name' => 'ddd' ),
  array( 'category' => 11, 'name' => 'eee' ),
  array( 'category' => 11, 'name' => 'fff' ),
  array( 'category' => 13, 'name' => 'ggg' ),
);

// Create a container using "category"
$groups = array_fill_keys( array_unique( array_column( $array, 'category') ), array() );

// Loop and Sort
foreach( $array as $index => $item )
{
  $groups[ $item['category'] ][ $index ] = $item;
}

// Done
print_r( $groups );

有了这些信息后,现在就可以通过每个子数组中的计数来找出哪些记录具有多个记录。