Существует ли минимальный способ преобразования ассоциативного массива в числовой массив с каждым элементом, хранящим ключ и значение?

Мне просто нужно конвертировать в PHP:

[
    'id' => '1',
    'code' => 'DRX',
    'company_name' => 'Dave Ricks Ltd'
], 
[
    'id' => '2',
    'code' => 'LRT',
    'company_name' => 'LiveRave Ltd'
]

Для того, чтобы...

[
    [
        [
            'name' => 'id',
            'value' => '1',
        ],
        [
            'name' => 'code',
            'value' => 'DRX',
        ],
        [
            'name' => 'company_name',
            'value' => 'Dave Ricks Ltd',
        ]
    ], 
    [
        [
            'name' => 'id',
            'value' => '2',
        ],
        [
            'name' => 'code',
            'value' => 'LRT',
        ],
        [
            'name' => 'company_name',
            'value' => 'LiveRave Ltd',
        ]
    ]
]

Я знаю, что могу сделать это с помощью нескольких циклов foreach, но мне было интересно, если бы с помощью некоторых функций массива PHP я мог сделать то же самое с меньшим количеством строк кода?

2 ответа

Я предполагаю, что ваш начальный массив на самом деле

[
  [
    'id' => '1', 'code' => 'DRX', 'company_name' => 'Dave Ricks Ltd'
  ],
  [
    'id' => '2', 'code' => 'LRT', 'company_name' => 'LiveRave Ltd'
  ]
]

так как это то, что вы получите из базы данных. Если я ошибаюсь, и вы опубликовали фактическое var_dump/print_r массива, это очень странно, но мы можем добавить шаг для его реорганизации.

Так что все, что нам нужно сделать, это

$input = [
    [
        'id' => '1',
        'code' => 'DRX',
        'company_name' => 'Dave Ricks Ltd',
    ], 
    [
        'id' => '2',
        'code' => 'LRT',
        'company_name' => 'LiveRave Ltd',
    ]
];

$output = array_map(function($elem) { 

    return [
        ['name' => 'id', 'value' => $elem['id'] ],
        ['name' => 'code', 'value' => $elem['code'] ],
        ['name' => 'company_name', 'value' => $elem['company_name'] ],
    ];

}, $input);
print_r($output);

Если вы хотите, чтобы преобразование было более общим:

$output = array_map(function($elem) { 

    $result = [];
    foreach ($elem as $key => $value) {
        $result[] = ['name' => $key, 'value' => $value];
    }
    return $result;

}, $input);
print_r($output);

Я думаю о том, есть ли способ удалить этот внутренний foreach - но я не думаю, что есть тот, который стоит усилий.

Вы можете попробовать это:

while ($array) {
    $item = array_shift($array);

    $new_entry = array();

    foreach ($item as $key => $value) {
        $new_item['name'] = $key;
        $new_item['value'] = $value;

        $new_entry[] = $new_item;
    }

    $new_array[] = $new_entry;
}

$final_array = array($new_array);

print_r($final_array);

Печать:

Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [0] => Array
                        (
                            [name] => id
                            [value] => 1
                        )

                    [1] => Array
                        (
                            [name] => code
                            [value] => DRX
                        )

                    [2] => Array
                        (
                            [name] => company_name
                            [value] => Dave Ricks Ltd
                        )

                )

            [1] => Array
                (
                    [0] => Array
                        (
                            [name] => id
                            [value] => 2
                        )

                    [1] => Array
                        (
                            [name] => code
                            [value] => LRT
                        )

                    [2] => Array
                        (
                            [name] => company_name
                            [value] => LiveRave Ltd
                        )

                )

        )

)
Другие вопросы по тегам