Лучший способ взорваться дважды в PHP - PullRequest
2 голосов
/ 09 сентября 2011

Дано:

$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"
  }
}

Есть ли более эффективный / чистый способ достижения того же результата?

Я бы предпочел что-то без лямбда-функций, поскольку PHP 5.2 не поддерживает их. Но в любом случае это чисто интеллектуальный вопрос, так что это просто предпочтение.

Ответы [ 2 ]

2 голосов
/ 09 сентября 2011

Я бы рекомендовал против ссылок - вы можете столкнуться с некоторыми странными ошибками.Но ваш подход в порядке.Кроме того, вы можете сделать что-то с array_map:

$val = array_map(function($v) { return explode(':', $v); }, explode(';', $val)));
2 голосов
/ 09 сентября 2011

Вы можете попробовать:

$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"
}
...