我有这个数组:
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
)
)
此处0
和3
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,但它没有给我任何结果。
我该如何处理?
答案 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)