PHP array_reduce с начальным параметром в качестве массива

У меня есть этот начальный массив:

[
0 => ['id' => 5, 'value' => 50],
1 => ['id' => 6, 'value' => 60],
2 => ['id' => 7, 'value' => 70],
]

и хотите преобразовать его в:

[
5 => ['value' => 50],
6 => ['value' => 60],
7 => ['value' => 70],
]

Сначала я пытался использовать map, но он не может изменить ключи массива, поэтому я подумал reduce решит проблему, потому что это уменьшает массив в одно значение, в данном случае массив. Итак, я попробовал:

array_reduce(
$array,
function($carry, $item) {
return $carry[$item['id']] = $item['value'];
},
[]
);

Но это возвращает эту ошибку Cannot use a scalar value as an array, Что я делаю неправильно? Есть ли array_reduce не может получить массив в качестве начального значения?

3

Решение

Как Mark Bakerсделал это. Я также сделал с foreach петля.

$arr = array(
array('id' => 5, 'value' => 50),
array('id' => 6, 'value' => 60),
array('id' => 7, 'value' => 70)
);

$result = array();
$result = array_column($arr, 'value', 'id');
array_walk($result, function(&$value) { $value = ['value' => $value]; });//I did this using foreach loop, But the OP need it through array function.
//foreach($arr as $key => $value){
//    $result[$value['id']] = array('value' => $value['value']);
//}

echo '<pre>';
print_r($result);

Результат:

Array
(
[5] => Array
(
[value] => 50
)

[6] => Array
(
[value] => 60
)

[7] => Array
(
[value] => 70
)

)
1

Другие решения

Иногда лучшие решения самые простые. Проходите по вашему массиву и присваивайте идентификатор и значение новому массиву.

$new_array = array();
foreach ($array as $key => $arr) {
$new_array[$arr['id']] = array('value' => $arr['value']);
}
1

Вы можете сделать это функционально. Я подозреваю, что это на самом деле не более читабельно, однако.

array_combine(
array_column($a, 'id'),
array_map(function($v) { return ['value' => $v['value']]; }, $a)
);

Или даже…

array_map(
function($v) { return ['value' => $v['value']]; },
array_column($a, null, 'id')
)
0

array_reduce($ar, function ($acc, $item) {
$acc[$item['id']] = [ 'value' => $item['value']];
return $acc;
}, [])
0

Ваш array_reduce не работал, потому что вы не возвращали массив аккумуляторов (carry в вашем случае) из функции обратного вызова.

array_reduce(
$array,
function($carry, $item) {
$carry[$item['id']] = $item['value'];
return $carry; // this is the only line I added :)
},
[]
);

Я пришел к этому вопросу, когда искал способ использования array_reduce, поэтому я чувствовал, что должен написать этот комментарий. Надеюсь, это поможет будущим читателям. 🙂

0
По вопросам рекламы [email protected]