我不熟悉 PHP 语言。如果名称匹配,我需要合并帐户数据并过滤掉数组结构中提供的重复数据。
我正在尝试合并 accounts
值,然后使用 array_unique 来保持该值的唯一性,但我不确定在哪里编写此逻辑。
$array =
array:2 [
0 => array:2 [
"name" => "account.payroll"
"accounts" => array:3 [
0 => array:3 [
"id" => 27
"code" => "700000"
]
1 => array:3 [
"id" => 101
"code" => "701000"
]
]
1 => array:2 [
"name" => "account.payroll"
"accounts" => array:3 [
0 => array:3 [
"id" => 27
"code" => "700000"
]
1 => array:3 [
"id" => 102
"code" => "702000"
]
]
]
预期输出
array:1 [
0 => array:3 [
"name" => "account.payroll"
"accounts" => array:7 [
0 => array:3 [
"id" => 27
"code" => "700000"
]
1 => array:3 [
"id" => 101
"code" => "701000"
]
2 => array:3 [
"id" => 102
"code" => "702000"
]
]
]
]
我的代码
array_map(function($tmp) {
unset($tmp['total_net_movement']);
if (isset($tmp['accounts'])) {
foreach ($tmp['accounts'] as $key => $value) {
unset($value['net_movement']);
$tmp['accounts'][$key] = $value;
}
}
return $tmp;
}, $array);
答案 0 :(得分:0)
预期数组具有输入数组[0]的结构。这被用作基础。 “帐户”都是用 array_merge() 收集的。 array_unique() 过滤掉所有重复的条目。
$newData = $input[0];
foreach($input as $i => $dataItem){
if($i == 0) continue;
$newData['accounts'] = array_merge($newData['accounts'],$dataItem['accounts']);
}
$newData['accounts'] = array_values(array_unique($newData['accounts'],SORT_REGULAR));
$newData = [$newData];
答案 1 :(得分:0)
假设帐户名称 ($array[*]['name']
) 很简单(例如,字母数字)并且很短,我们可以用它来索引新数组,以便更快/更简单地查找。我们也可以对帐户 ($array[*]['accounts']
) 执行相同的操作。
$newArray = [];
foreach ($array as $accountType) {
// If the account name (eg, $newArray['account.payroll']) does not exist, create/insert it
if (!isset($newArray[$accountType['name']])) {
$newArray[$accountType['name']] = $accountType;
$newArray[$accountType['name']]['accounts'] = [];
}
// If the accounts under said name (eg, $newArray['account.payroll']['accounts'][27]) does not exist, create/insert it
foreach ($accountType['accounts'] as $account) {
if (!isset($newArray[$accountType['name']]['accounts'][$account['id']])) {
$newArray[$accountType['name']]['accounts'][$account['id']] = $account;
}
}
}
var_dump($newArray);
// [
// 'account.payroll' => [
// 'name' => 'account.payroll',
// 'accounts' => [
// 27 => [
// 'id' => 27,
// 'code' => '700000',
// ],
// 101 => [
// 'id' => 101,
// 'code' => '701000',
// ],
// 102 => [
// 'id' => 102,
// 'code' => '702000',
// ],
// ],
// ],
// ]
// If for some reason we want the account types and accounts to only be indexed with zero-based sequential integer
$newArray = array_values($newArray);
foreach ($newArray as &$accountType) {
$accountType['accounts'] = array_values($accountType['accounts']);
}
unset($accountType);
// Or
$newArray = array_values($newArray);
array_walk($newArray, function (&$accountType) {
$accountType['accounts'] = array_values($accountType['accounts']);
});
var_dump($newArray);
// [
// 0 => [
// 'name' => 'account.payroll',
// 'accounts' => [
// 0 => [
// 'id' => 27,
// 'code' => '700000',
// ],
// 1 => [
// 'id' => 101,
// 'code' => '701000',
// ],
// 2 => [
// 'id' => 102,
// 'code' => '702000',
// ],
// ],
// ],
// ]
答案 2 :(得分:0)
以下代码片段应该可以解决问题。
<?php
declare(strict_types=1);
$array = [
[
'name' => 'account.payroll',
'accounts' => [
[
'id' => 27,
'code' => '700000',
],
[
'id' => 101,
'code' => '701000',
],
],
],
[
'name' => 'account.payroll',
'accounts' => [
[
'id' => 27,
'code' => '700000',
],
[
'id' => 102,
'code' => '702000',
],
],
],
];
$result = [];
foreach ($array as $element) {
if (!\array_key_exists($element['name'], $result)) {
$result[$element['name']] = [
'name' => $element['name'],
'accounts' => [],
];
}
foreach ($element['accounts'] as $account) {
if (!\array_key_exists($account['id'], $result[$element['name']]['accounts'])) {
$result[$element['name']]['accounts'][$account['id']] = $account;
}
}
}
$result = array_values($result);
foreach ($result as $key => $value) {
$result[$key]['accounts'] = array_values($value['accounts']);
}
var_dump($result);
输出将是:
array(1) {
[0]=>
array(2) {
["name"]=>
string(15) "account.payroll"
["accounts"]=>
array(3) {
[0]=>
array(2) {
["id"]=>
int(27)
["code"]=>
string(6) "700000"
}
[1]=>
array(2) {
["id"]=>
int(101)
["code"]=>
string(6) "701000"
}
[2]=>
array(2) {
["id"]=>
int(102)
["code"]=>
string(6) "702000"
}
}
}
}