Импланирование ассоциативного массива в PHP
Скажем, у меня есть массив:
$array = Array(
'foo' => 5,
'bar' => 12,
'baz' => 8
);
И я хотел бы напечатать строку текста в моем представлении следующим образом:
"Значения: foo (5), bar (12), baz (8)"
Что я могу сделать, так это:
$list = Array();
foreach ($array as $key => $value) {
$list[] = "$key ($value)";
}
echo 'The values are: '.implode(', ',$list);
Но я чувствую, что должен быть более простой способ, без необходимости создавать массив $list
в качестве дополнительного шага. Я пробовал array_map
и array_walk
, но не имел успеха.
Итак, мой вопрос: какой лучший и самый короткий способ сделать это?
Ответы
Ответ 1
Проблема с array_map
заключается в том, что функция обратного вызова не принимает ключ в качестве аргумента. Вы можете написать свою собственную функцию, чтобы заполнить пробел здесь:
function array_map_assoc( $callback , $array ){
$r = array();
foreach ($array as $key=>$value)
$r[$key] = $callback($key,$value);
return $r;
}
Теперь вы можете сделать это:
echo implode(',',array_map_assoc(function($k,$v){return "$k ($v)";},$array));
Ответ 2
Есть способ, но он довольно подробный (и, возможно, менее эффективный):
<?php
$array = Array(
'foo' => 5,
'bar' => 12,
'baz' => 8
);
// pre-5.3:
echo 'The values are: '. implode(', ', array_map(
create_function('$k,$v', 'return "$k ($v)";'),
array_keys($array),
array_values($array)
));
echo "\n";
// 5.3:
echo 'The values are: '. implode(', ', array_map(
function ($k, $v) { return "$k ($v)"; },
array_keys($array),
array_values($array)
));
?>
Оригинальный код выглядит хорошо для меня.
Ответ 3
Вы можете распечатать значения при повторении:
echo 'The values are: ';
foreach ($array as $key => $value) {
$result .= "$key ($value),";
}
echo rtrim($result,',');
Ответ 4
Принимая помощь от ответа @linepogl, я редактировал код, чтобы сделать его более простым, и он отлично работает.
function array_map_assoc($array){
$r = array();
foreach ($array as $key=>$value)
$r[$key] = "$key ($value)";
return $r;
}
А затем просто вызовите функцию, используя
echo implode(' , ', array_map_assoc($array));
Ответ 5
Я придумал
foreach ($array as &$item)
{
$item = reset($item);
}
$array = implode(', ', $array);
var_dump($array);