Скажем, у меня есть массив:
$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
, но не array_walk
.
Поэтому мой вопрос: какой лучший и самый короткий способ сделать это?
Проблема с 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));
Есть способ, но он довольно многословный (и, возможно, менее эффективный):
<?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) )); ?>
Ваш оригинальный код выглядит хорошо для меня.
Вы можете распечатывать значения при повторении:
echo 'The values are: '; foreach ($array as $key => $value) { $result .= "$key ($value),"; } echo rtrim($result,',');
Принимая помощь от ответа @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));
Я придумал
foreach ($array as &$item) { $item = reset($item); } $array = implode(', ', $array); var_dump($array);