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

How to format a simple PHP array of strings?

提问人:Jeff 提问时间:1/4/2010 最后编辑:Jeff 更新时间:1/5/2010 访问量:12499

问:

我有这个简单的函数,我将其传递到一个字符串数组中:

function myfunction( $arg = array() )
{
    // do stuff to $arg...
    // return a $string;
}

到目前为止很简单,但我需要格式化数组中的一些字符串,而有些字符串仍未格式化。我不知道该怎么做?$arg

假设我运行这个:$argmyfunction()

echo myfunction( array( 'format me!', 'do not format me!' ) );

我小小的脑袋不知道如何判断数组中的第一个值需要格式化,它不应该格式化第二个值。myfunction()$arg

我想过一个关联数组,但我认为这可能是错误的方法,因为具有相同的索引。

echo myfunction( array( 'format' => 'hi', 'format' => 'bye', 'noformat' => 'foo');

只是在寻找正确方向的“推动”。

编辑1:

忘了说,我只能有一个数组,因为我需要按特定顺序排列键。$arg

编辑2:

数组可以具有用户所需的任意数量的键。$arg

PHP 数组

评论

1赞 salathe 1/4/2010
数组中是否只有两个项目,第一个是唯一需要“格式化”的项目:即,你怎么知道哪个项目需要格式化,哪个不需要?
0赞 Jeff 1/4/2010
不可以,数组中的项数量可以任意多。至于你的第二个问题,这就是问题所在。=)$arg
0赞 Mark Biek 1/4/2010
数组中的数据是否有任何内容可以确定是否需要格式化?如果有 100 个元素,如何判断哪些元素会格式化?
0赞 Jeff 1/4/2010
马克,这正是我要问的。
0赞 Mark Biek 1/4/2010
杰夫,我认为我们无法用我们掌握的信息来回答这个问题:)中方能否介绍有关情况?这里的目标是什么?

答:

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