如何格式化一个简单的PHP字符串数组?

时间:2010-01-04 13:26:48

标签: php arrays

我有这个简单的函数,我传入一个字符串数组:

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数组可以包含用户想要的密钥数。

5 个答案:

答案 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);

这个想法是使用单独的类来区分字符串。