在逗号和管道上爆炸字符串以创建两个数组

时间:2017-04-28 04:50:47

标签: php arrays codeigniter split explode

我编码如下,得错了输出:

$asst_vicars_data_arr=explode(',',$asst_vicars_data);
$asst_head_type_count=count($asst_vicars_data_arr);

$d = explode("|",$data);
foreach ($asst_vicars_data_arr as $value) {
    $arr = explode("|",$value);
    print_r($arr); 
}

输入:

$asst_vicars_data_arr=Array ( [0] => PT|1 [1] => O|4 [2] => PT|15,... )

预期输出:

$type=Array([0] => PT, [1] => O,...)
$heads=Array([0] => 1, [1] => 4,...)

我该怎么做才能创建这两个数组?

3 个答案:

答案 0 :(得分:3)

我希望这会帮助你,我在这里使用explode打破字符串和foreach循环。

Try this code snippet here

<?php

ini_set('display_errors', 1);
$asst_vicars_data_arr=Array ( 0 => "PT|1",
                              1 => "O|4",
                              2 => "PT|15",
                              3 =>"1|6");
$types=array();
$heads=array();
foreach($asst_vicars_data_arr as $value)
{
    list($types[],$heads[])=explode("|",$value);
}

print_r($types);
print_r($heads);

答案 1 :(得分:3)

你可以尝试一下

<?php
$asst_vicars_data_arr=array ( 0 => 'PT|1' , 1 => 'O|4' , 2 =>'PT|15');
foreach ($asst_vicars_data_arr as $value) {
    $arr = explode("|",$value);
    $type [] = $arr[0];
    $heads [] = $arr[1];
}
print_r($type);
print_r($heads);
?>

Fiddle

答案 2 :(得分:2)

这个问题的核心是一个字符串到数组的转换练习。让我们研究一些可以减少迭代函数调用次数的方法,而不是做一大堆explode(),...

方法#1 :使用preg_match()&amp; list()

preg_match_all('/([^|]+)\|([^,]+),?/',$asst_vicars_data,$m)?list(,$type,$heads)=$m:null;
// output: $type=array(0=>'PT', 1=>'O', 2=>'PT')
// output: $heads=array(0=>'1', 1=>'4', 2=>'15')

方法#2 :使用preg_split()array_chunk()array_column()

的3-liner
$asst_vicars_data='PT|1,O|4,PT|15';
$a=array_chunk(preg_split('/,|\|/',$asst_vicars_data),2);
$type=array_column($a,0);  // output: array(0=>'PT', 1=>'O', 2=>'PT')
$heads=array_column($a,1); // output: array(0=>'1', 1=>'4', 2=>'15')

我的第一种方法是使用精简正则表达式模式来提取list()容易设置为变量的值。 list()的前导逗号表示$m的第一个子数组(完整字符串)不会被赋予变量名。

我的第二种方法使用精简正则表达式模式在同一步骤中爆炸管道和逗号上的字符串。 array_chunk()将元素成对出现。最后array_column()获取数组中的“垂直”值。

此页面上当前的所有其他答案均在每次迭代时使用explode()次调用。随着输入的大小增加,这种方法变得越来越低效。因此,进行一次爆炸/分裂并从那里继续前进将更有效。

方法#1显然是我最喜欢的方法;我只是想把方法#2作为一种替代方案,它在处理碎片之前也只解析一次字符串。

以下是一些其他方法,其行为类似于其他答案中的foreach循环(它们也遭受相同的低效率,因为它们在每次迭代时调用explode()):

array_map()可以用来写一个漂亮的小单行:

$asst_vicars_data='PT|1,O|4,PT|15';
array_map(function($a)use(&$type,&$heads){list($type[],$heads[])=explode('|',$a);},explode(',',$asst_vicars_data));
var_export($type);
var_export($heads);

array_walk()相同的故事,但附加了一行代码:

$asst_vicars_data='PT|1,O|4,PT|15';
$asst_vicars_data_arr=explode(',',$asst_vicars_data);
array_walk($asst_vicars_data_arr,function($a)use(&$type,&$heads){list($type[],$heads[])=explode('|',$a);});
var_export($type);
var_export($heads);