Скажем, у меня есть ассоциативный массив, как показано ниже:
$myAssocArray = [
[ 'Name' => 'AWS_Bucket-Name1', 'Value' => 'Bucket data',...],
[ 'Name' => 'AWS_Bucket-Name2', 'Value' => 'Bucket data',...],
[ 'Name' => 'AWS_Bucket-Name3', 'Value' => 'Bucket data',...],
[ 'Name' => 'AWS_Bucket-Name4', 'Value' => 'Bucket data',...],
];
Из этого я хочу создать простой ассоциативный массив, как показано ниже:
[ ['AWS_Bucket-Name1' => 'Bucket data'], ['AWS_Bucket-Name2' => 'Bucket data'], ...]
Поэтому я могу использовать два подхода, чтобы решить эту проблему:
(1) Используйте функцию array_map в php:
$destinationArray = array_map('myMapFunction', $myAssocArray);
function myMapFunction($entity): array {
if (is_array($entity) && isset($entity['Name'], $entity['Value'])) {
return [$entity['Name'] => $entity['Value']];
}
}
ИЛИ ЖЕ
(2) Использование функций array_column и array_combine:
$keys = array_column($myAssocArray, 'Name');
$values = array_column($myAssocArray, 'Value');
$destinationArray = array_combine($keys, $values);
Какой подход будет более рекомендованным, а какой будет более производительным и эффективным? ИЛИ есть ли еще лучшее решение, для которого не нужен цикл foreach?
Вместо array_column и array_combine я бы предложил преобразовать ваш массив в коллекцию, а затем применить метод pluck. как это. collect($myAssocArray)->pluck('Value', 'Name')->toArray();






Я бы не стал здесь смотреть на производительность, потому что эти операции очень малы. Я бы больше сосредоточился на чистом коде.
Решение array_map() сложнее понять с первого взгляда.
Вам не нужно использовать array_combine() и двойной вызов array_column(). Вместо этого вы можете передать третий аргумент array_column(), который
"index key" The column to use as the index/keys for the returned array. This value may be the integer key of the column, or it may be the string key name.
Следующий код
array_column($myAssocArray, 'Value', 'Name')
печатает тот же результат, что и требуется.
Имейте в виду, что PHP внутренне может замечать и оптимизировать множество вещей для повышения производительности. Очевидно, что лучше, когда это делает разработчик, но иногда вы получаете 1 мкс производительности за счет стоимости чистого кода и головной боли разработчика, поддерживающего этот код.
Метод array_map дает вам больше возможностей обрабатывать отсутствующие / неожиданные / несогласованные значения во входных данных. array_column / comb проще писать, но вы теряете этот уровень контроля. Производительность / эффективность будут примерно одинаковыми. Я не думаю, что это та область, где можно ожидать от оптимизации большого прироста производительности.