如何合并和唯一的多维数组

时间:2020-12-19 07:49:54

标签: php arrays multidimensional-array merge php-7

我不熟悉 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);

3 个答案:

答案 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"
      }
    }
  }
}
相关问题