Импланирование ассоциативного массива в 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);