将两个公共数组合并为一个数组

时间:2015-06-29 13:12:49

标签: php arrays laravel-5

我有这个数组:

Array
(
    [0] => stdClass Object
        (
            [client_id] => 70
            [client_name] => Berws
            [account_identifier] => ACL70
            [ticket_identifier] => B21
            [ticket_id] => 21
            [stage_name] => New

        )


    [1] => stdClass Object
        (
            [client_id] => 75
            [client_name] => ASDF
            [account_identifier] => 
            [ticket_identifier] => BB17
            [ticket_id] => 17
            [stage_name] => New

        )

    [2] => stdClass Object
        (
            [client_id] => 71
            [client_name] => QWERT
            [account_identifier] => ACI71
            [ticket_identifier] => B15
            [ticket_id] => 15
            [stage_name] => Won

        )

    [3] => stdClass Object
        (
            [client_id] => 70
            [client_name] => Berws
            [account_identifier] => ACL70
            [ticket_identifier] => B14
            [ticket_id] => 14
            [stage_name] => In Progress

        )
)

此处03 rd索引位于同一帐户下,但票证不同 - 它们已关联。

我想操纵这个数组,以便帐户下的所有链接票证在一个数组中组合在一起,其余部分按原样显示。

foreach($data as $result) {
  if(in_array($value->account_identifier, $result)) {
                echo $value->account_identifier;
  }
}

我期待这样的事情:

[0] => stdClass Object
            (
                [client_id] => 70
                [client_name] => Berws
                [account_identifier] => ACL70

                [ACL70] => (
                       [0] => (
                            [ticket_identifier] => B21
                            [ticket_id] => 21
                            [stage_name] => New
                       )
                       [1] => (
                            [ticket_identifier] => B21
                            [ticket_id] => 21
                            [stage_name] => New
                       )
                 )
            )

我尝试使用in_array,但它没有给我任何结果。

我该如何处理?

2 个答案:

答案 0 :(得分:1)

我不认为你可以在不迭代整个数组的情况下做到这一点,并手动检查记录重复。你可以使用array_filter& array_map可以加快速度,但就是这样。

只有在您拥有大量重复票证时才会有效。如果你不建议我做一个快速的哈希映射。

$initial = [/* your initial array */];
$merged = []; /* this will be your merged array */
$alreadyMergedClients = []; /* what clients have been already merged */

foreach($initial as $key => $record) {
    /* if client has been already merged, ignore */
    if(in_array($record->client_id, $alreadyMergedClients))
        continue;

    /* search for all clients with ID 70 */
    $clientTickets = array_filter($initial, function($item) use ($record) {
         return $item->client_id == $record->client_id;
    });

    if(count($clientTickets) > 1) {
        /*  there are several tickets, merge */
        $mergedRecord = (object)[
            'client_id' => $record->client_id,
            'client_name' => $record->client_name,
            'account_identifier' => $record->account_identifier
        ];

        $mergedRecord->{$record->account_identifier} = array_map(function($item) {
            return (object)[
                'ticket_identifier' => $item->ticket_identifier,
                'ticket_id' => $item->ticket_id,
                'stage_name' => $item->stage_name
            ];
        }, $clientTickets);

        $merged[$key] = $mergedRecord;
    } else {
        /* there is only one record, live it alone */
        $merged[$key] = $record;
    }   

    $alreadyMergedClients[] = $record->client_id;
}

请注意,您需要PHP> = 5.3才能使用array_filter和array_map中的匿名函数以及PHP> = 5.4来使用简化的数组符号

答案 1 :(得分:0)

您需要使用array_merge_recursive