在PHP中使用关联数组

Ale*_*lec 19 php

说我有一个数组:

$array = Array(
  'foo' => 5,
  'bar' => 12,
  'baz' => 8
);
Run Code Online (Sandbox Code Playgroud)

我想在我的视图中打印一行文字,如下所示:

"价值观是:foo(5),bar(12),baz(8)"

我能做的是:

$list = Array();
foreach ($array as $key => $value) {
  $list[] = "$key ($value)";
}
echo 'The values are: '.implode(', ',$list);
Run Code Online (Sandbox Code Playgroud)

但我觉得应该有一个更简单的方法,而不必创建$list数组作为额外的步骤.我一直想array_maparray_walk,但没有成功.

所以我的问题是:最好和最短的方法是什么?

lin*_*ogl 21

问题array_map是回调函数不接受键作为参数.您可以编写自己的函数来填补这里的空白:

function array_map_assoc( $callback , $array ){
  $r = array();
  foreach ($array as $key=>$value)
    $r[$key] = $callback($key,$value);
  return $r;
}
Run Code Online (Sandbox Code Playgroud)

现在你可以这样做:

echo implode(',',array_map_assoc(function($k,$v){return "$k ($v)";},$array));
Run Code Online (Sandbox Code Playgroud)

  • 好的!我也赞成所有的答案,但我会选择这个 :) 很容易添加一行,而且仍然非常灵活。 (2认同)
  • 它不会产生额外的数组遍历(一个用于“array_map_assoc”,另一个用于“implode”)吗? (2认同)

Rob*_*ana 12

对我来说,最好和最简单的解决方案是:

$string = http_build_query($array, '', ',');
Run Code Online (Sandbox Code Playgroud)

  • 这对我来说是最好的解决方案。简单,无需重新发明轮子。 (2认同)
  • 这应该是 `$string = urldecode ( http_build_query($array, '', ',') ) ;` 来获取非 ASCII 字符串。 (2认同)

Lig*_*ica 9

一种方式,但它是相当冗长(和可能效率较低):

<?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)
));
?>
Run Code Online (Sandbox Code Playgroud)

您的原始代码对我来说很好.


Chr*_*ong 5

您可以在迭代时打印出这些值:

echo 'The values are: ';
foreach ($array as $key => $value) {
  $result .= "$key ($value),";
}
echo rtrim($result,',');
Run Code Online (Sandbox Code Playgroud)