【问题标题】:A better way to explode twice in PHP在 PHP 中爆炸两次的更好方法
【发布时间】:2011-09-08 22:32:47
【问题描述】:

给定:

$val = "font-size:12px;color:#ff0000;font-family:Arial";

下面的代码会将字符串分解两次,生成一个数组数组:

$val = explode(';',$val);
foreach($val as &$v)
    $v = explode(':',$v);

var_dump($val);

输出是:

array(3) {
  [0]=>
  array(2) {
    [0]=>
    string(9) "font-size"
    [1]=>
    string(4) "12px"
  }
  [1]=>
  array(2) {
    [0]=>
    string(4) "fill"
    [1]=>
    string(7) "#ff0000"
  }
  [2]=>
  &array(2) {
    [0]=>
    string(11) "font-family"
    [1]=>
    string(5) "Arial"
  }
}

有没有更有效/更清洁的方法来达到同样的效果?

我更喜欢没有 lambda 函数的东西,因为 PHP 5.2 不支持它们。但这无论如何都是一个纯粹的智力问题,所以,这只是一个偏好。

【问题讨论】:

  • 看来array_map() 可能会成为答案。
  • @Jared:我也在想同样的事情。但我更喜欢没有 lambda 函数
  • 那你不应该把它包括在你的问题中吗?
  • 你目前的方法是什么让它感觉效率低下/不干净?
  • @Jared:是的,我应该有 :-) 我已经编辑了我的问题。

标签: php arrays string performance explode


【解决方案1】:

你可以试试:

$input  = "font-size:12px;color:#ff0000;font-family:Arial";

preg_match_all('/([^:]*?):([^;]*);?/', $input, $matches);

$output = array_combine($matches[1], $matches[2]);

输出:

array(3) {
  ["font-size"]=>
  string(4) "12px"
  ["color"]=>
  string(7) "#ff0000"
  ["font-family"]=>
  string(5) "Arial"
}

【讨论】:

  • 我没有得到相同的输出。我得到array(3) { ["font-size"]=> string(0) "" ["12px;color"]=> string(0) "" ["#ff0000;font-family"]=> string(0) "" }
【解决方案2】:

我建议不要引用——你可能会遇到一些奇怪的错误。但是你的方法很好。或者,您可以使用 array_map 做一些事情:

$val = array_map(function($v) { return explode(':', $v); }, explode(';', $val)));

【讨论】:

  • 我对引用非常满意,所以我并不担心。我的方法效果很好,我只是想要一些更酷的。 :-) 你的很好,虽然它需要 PHP 5.3
  • “我对引用很满意”——这并不能让它们很好用:)
  • 没有。与任何东西一样,它们是一种工具。仅仅因为我的工具箱中有参考并不意味着它们适用于每个应用程序。但是在我使用它们的方式上,这些引用不会产生任何奇怪的错误,所以我认为没有理由在这种情况下避免它们,因为我很好地理解它们并且知道我为什么在这里使用它们。
猜你喜欢
  • 2015-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-26
  • 2013-02-13
  • 2017-02-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多