PHP - 将字符串拆分为多维数组的无循环方法

问题描述 投票:0回答:6

如何在 PHP 中将字符串拆分为多维数组而不使用循环?

我的字符串格式为

"A,5|B,3|C,8"

php arrays string scripting
6个回答
7
投票

如果没有 you 实际上执行循环部分,基于

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)

当然,这部分代码可以重写以不使用 lambda 函数,并使用 PHP < 5.3 -- but not as fun ^^


尽管如此,我认为

array_map
将循环
explode
返回的数组的每个元素...因此,即使循环不在您的代码中,仍然会有一个...


3
投票

根本没有循环?做不到。无需编写循环?爆炸或正则表达式“分割”方法之一。


2
投票
preg_match_all("~([^|,]+),([^|,]+)~", $str, $m);
$result = array_combine($m[1], $m[2]);

这会返回一个类似 array('A' => 5, 'B' => 3 等的数组


0
投票

取决于 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
投票

只要您知道每行中有多少个项目,您就可以在一次前瞻中声明一个或多个捕获组。

这“不是循环”,或者至少不是像

foreach()
array_map()
这样的循环。 演示

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

preg_match_all(
    '/[^,|]+,(?=([^|]+))/',
    $str,
    $m,
    PREG_SET_ORDER 
);
var_export($m);

输出:

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

-1
投票

如果您的数据很大,这可能会变得很重,但这里有一个解决方案:

<?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,
);
© www.soinside.com 2019 - 2024. All rights reserved.