在PHP中进行两次爆炸的更好方法

在PHP中进行两次爆炸的更好方法,php,arrays,string,performance,explode,Php,Arrays,String,Performance,Explode,鉴于: 以下代码将对字符串进行两次分解,以生成数组数组: $val = "font-size:12px;color:#ff0000;font-family:Arial"; 输出为: $val = explode(';',$val); foreach($val as &$v) $v = explode(':',$v); var_dump($val); 是否有更有效/更清洁的方法来实现相同的结果 我更喜欢没有lambda函数的东西,因为PHP5.2不支持它们。但这是一个纯粹的智

鉴于:

以下代码将对字符串进行两次分解,以生成数组数组:

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

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

var_dump($val);
是否有更有效/更清洁的方法来实现相同的结果

我更喜欢没有lambda函数的东西,因为PHP5.2不支持它们。但这是一个纯粹的智力问题,因此,这只是一个偏好。

您可以尝试:

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"
  }
}
输出:

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

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

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

我建议不要使用引用--您可能会遇到一些奇怪的错误。但你的方法很好。或者,您可以使用array_map执行以下操作:

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

这似乎很可能会成为一个答案。@Jared:我也在想同样的事情。但是我更喜欢没有lambda函数。你不应该在你的问题中包括这个吗?你目前的方法会让人觉得效率低下/不干净吗?@Jared:是的,我应该:-)我已经编辑了我的问题。我没有得到相同的输出。我得到了
array(3){[“font size”]=>string(0)”[“12px;color”]=>string(0)”[“#ff0000;font-family”]=>string(0)”}
我对引用非常满意,所以我不关心它。我的方法很好,我只是想要一些更酷的东西。:-)你的很好,尽管它需要PHP5.3“我对引用很满意”——这并不能让它们很好地使用:)不,就像任何东西一样,它们是一个工具。我的工具箱中有引用并不意味着它们适用于所有应用程序。但是在我使用它们的方式中,引用不会产生任何奇怪的错误,所以我认为没有理由在这种情况下避免它们,因为我非常理解它们,并且知道我为什么在这里使用它们。
$val = array_map(function($v) { return explode(':', $v); }, explode(';', $val)));