PHP - без петель способ разбить строку на многомерный массив - PullRequest
0 голосов
/ 22 декабря 2009

Как мне разбить строку на многомерный массив в PHP без циклов?

Моя строка в формате "A,5|B,3|C,8"

Ответы [ 7 ]

7 голосов
/ 22 декабря 2009

Без вы фактически выполняете зацикленную часть, что-то на основе array_map + explode должно сработать; например, учитывая, что вы используете PHP 5.3:

$str = "A,5|B,3|C,8";

$a = array_map(
    function ($substr) {
        return explode(',', $substr);
    }, 
    explode('|', $str)
);
var_dump($a);

Получит вас:

array
  0 => 
    array
      0 => string 'A' (length=1)
      1 => string '5' (length=1)
  1 => 
    array
      0 => string 'B' (length=1)
      1 => string '3' (length=1)
  2 => 
    array
      0 => string 'C' (length=1)
      1 => string '8' (length=1)

Конечно, эта часть кода может быть переписана так, чтобы не использовать лямбда-функцию и работать с PHP <5.3 - но не так весело ^^ </p>


Тем не менее, я предполагаю, что array_map будет перебирать каждый элемент массива, возвращаемый explode ... Таким образом, даже если цикл отсутствует в вашем коде, он все равно будет один ...

3 голосов
/ 22 декабря 2009

без петель вообще? Не может быть сделано Без вас писать цикл? Взрыв или один из регулярных выражений "split" методы.

2 голосов
/ 22 декабря 2009
preg_match_all("~([^|,]+),([^|,]+)~", $str, $m);
$result = array_combine($m[1], $m[2]);

возвращает массив, подобный массиву ('A' => 5, 'B' => 3 и т. Д.

0 голосов
/ 22 декабря 2009

В зависимости от того, считается ли array_walk () как цикл ...

<?php

class Splitter {  
  function __construct($text){
    $this->items = array();
    array_walk(explode('|', $text), array($this, 'split'));
  }

  function split($input){
    $this->items[] = explode(',', $input);
  }
}

$s = new Splitter("A,5|B,3|C,8");
print_r($s->items);
0 голосов
/ 22 декабря 2009

Лучше всего использовать маленькую петлю.

$array1 = split('|',$data);
$final=array();
$foreach($array1 as $arraypart) {
$part = split(',',$arraypart);
$final[$part[0]] = $part[1];
}
0 голосов
/ 22 декабря 2009

Если ваши данные огромны, это может стать тяжелым, но вот одно из решений:

<?php
$data = "A,5|B,3|C,8";
$search = array("|",",");
$replace = array("&","=");
$array = parse_str(str_replace($search, $replace, $data));
?>

Результатом будет что-то вроде этого:

$array = array(
  A => 5,
  B => 3,
  C => 8,
);
0 голосов
/ 22 декабря 2009

Вы можете использовать комбинацию map и explode, но вы не избегаете цикла, вы просто не используете операторы for / while.

http://php.net/manual/en/function.array-map.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...