我有这个简单的函数,我传入一个字符串数组:
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
数组可以包含用户想要的密钥数。
答案 0 :(得分:4)
你可以这样做:
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
}
}
}
但是,由于你没有重复的密钥,如果你有重复的字符串,这种方法就会失败。
答案 1 :(得分:1)
为什么不让一个元素作为参数,而不是让myfunction()
将数组作为参数。然后,您可以使用array_map
来处理数组的每个元素。
有点像这样:
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);
答案 2 :(得分:1)
以下是我的意思。 __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) );
答案 3 :(得分:0)
这与表格行的格式奇怪地类似(每行的格式化功能不同)。我将数据作为单个数组提供,然后根据键提供格式化信息作为第二个数组。例如:
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' ));
答案 4 :(得分:0)
我不知道你格式化的这些字符串究竟代表什么,所以我在这些类上使用了泛型命名:
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);
这个想法是使用单独的类来区分字符串。