提问人:Jeff 提问时间:1/4/2010 最后编辑:Jeff 更新时间:1/5/2010 访问量:12499
如何格式化一个简单的PHP字符串数组?
How to format a simple PHP array of strings?
问:
我有这个简单的函数,我将其传递到一个字符串数组中:
function myfunction( $arg = array() )
{
// do stuff to $arg...
// return a $string;
}
到目前为止很简单,但我需要格式化数组中的一些字符串,而有些字符串仍未格式化。我不知道该怎么做?$arg
假设我运行这个:$arg
myfunction()
echo myfunction( array( 'format me!', 'do not format me!' ) );
我小小的脑袋不知道如何判断数组中的第一个值需要格式化,它不应该格式化第二个值。myfunction()
$arg
我想过一个关联数组,但我认为这可能是错误的方法,因为具有相同的索引。
echo myfunction( array( 'format' => 'hi', 'format' => 'bye', 'noformat' => 'foo');
只是在寻找正确方向的“推动”。
编辑1:
忘了说,我只能有一个数组,因为我需要按特定顺序排列键。$arg
编辑2:
数组可以具有用户所需的任意数量的键。$arg
答:
1赞
Mark Biek
1/4/2010
#1
与其将数组作为参数,不如让它只将单个元素作为参数。然后,您可以使用 array_map
来处理数组的每个元素。myfunction()
有点像这样:
function myfunction($element) {
if( do-formatting) {
//do your formatting stuff
$element = formatted-stuff
}
return $element
}
$arr = array("format me", "don't format me");
//This calls myfunction on each element of the array
//A new array is returned where each element has been replaced
//by the return value from myfunction.
$arr = array_map('myfunction', $arr);
评论
0赞
user229044
1/4/2010
您刚刚移动了问题;现在,如何告诉函数是否格式化每个单独的$element?
0赞
Mark Biek
1/4/2010
我想这取决于数组是否只有 2 个元素。从这个问题中我并不清楚这一点
4赞
cletus
1/4/2010
#2
您可以执行以下操作:
function myfunction(array $format, array $noformat) {
...
}
或
function myfunction(array $strings) {
foreach ($strings['format'] as $format) {
// do stuff
}
foreach ($strings['noformat'] as $noformat) {
// do stuff
}
}
跟:
myfunction(array(
'format' => array('one', 'two', 'three'),
'noformat' => array('four', 'five', 'six'),
));
如果(且仅当)字符串是唯一的,则可以将它们放在键中而不是值中:
$strings = array(
'one' => true,
'two' => false,
'three' => false,
'four' => true,
);
myfunction($strings);
跟:
function myfunction(array $strings) {
foreach ($strings as $k => $v) {
if ($v) {
// format string
}
}
}
但是,由于不能有重复的键,如果您有重复的字符串,则此方法会失败。
评论
0赞
Jeff
1/4/2010
这是一个很好的答案,但我忘了提到我需要按特定顺序排列,所以我不能做单独的和.$args
$format
$noformat
0赞
Kris Lamote
1/4/2010
您可以使用例如 array(array('format' => 'text'), array('noformat' => 'more text')) 作为$arg,并更改 myfunction 以接受此作为参数(提示将是 foreach ($arg as $formatKey => $text))
0赞
Jeff
1/4/2010
“如果(且仅当)......”编辑看起来不错!我想我会试一试。=)
0赞
Jeff
1/4/2010
也许这应该是一个新问题,但是如何测试数组以确保所有键都是唯一的?
0赞
cletus
1/4/2010
根据定义,所有键都是唯一的。如果尝试插入相同的密钥,它将覆盖旧值。
0赞
Victor Nicollet
1/4/2010
#3
这与表格行的格式化方式奇怪地相似(每行具有不同的格式化功能)。我会将数据作为单个数组提供,然后根据键将格式信息作为第二个数组提供。例如:
function rowFormatter(Array $data, Array $format=array()) {
ob_start();
foreach ($data as $key => $value) {
if (isset($format[$key]))
echo call_user_func($format[$key],$value);
else
echo $value;
}
return ob_get_clean();
}
function makeBold($x) { return '<b>'.$x.'</b>'; }
rowFormatter(array( "Hello", "Mister" ), array( 0 => 'makeBold' ));
0赞
Kevin
1/4/2010
#4
我不知道你格式化的这些字符串实际上代表什么,所以我在这些类上使用了通用命名:
class LineItem
{
var $value;
function __construct($val)
{
$this->value = $val;
}
function __toString()
{
return $this->value;
}
function getFormatted( $formatter )
{
return $this->value;
}
}
class FormattedLineItem extends LineItem
{
function getFormatted( $formatter )
{
return $formatter( $this->value );
}
}
function myfunction( $arr=array() )
{
$fnFormat = function($str) {
return ucwords($str);
};
foreach($arr as $obj)
{
$str = $obj->getFormatted($fnFormat);
echo "$str\n";
}
}
$arr = array(
new FormattedLineItem('format me!'),
new LineItem('do not format me!')
);
myfunction($arr);
这个想法是使用单独的类来区分字符串。
1赞
Benoît Vidis
1/4/2010
#5
这是我的意愿。 __tostring的实现不是强制性的,而是 myFunction 中的语法糖。
<?php
class MyString{
private $_value;
public $to_format;
public function __construct($str, $to_format = true){
$this->_value = $str;
$this->to_format = $to_format;
}
public function __tostring(){
return $this->_value;
}
}
$args = array( new MyString('format me'), new MyString('Not me!', false) );
评论
$arg