分解逗号和管道上的字符串以创建两个数组

Explode string on commas and pipes to create two arrays

我进行了如下编码,但得到了错误的输出:

$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,...)

如何创建这两个数组?

希望这对您有所帮助,这里我使用 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);

你可以试试这个

<?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

这道题的核心是字符串到数组的转换练习。与其做一大堆 explode(),不如让我们研究几个方法,它们将执行更少的迭代函数调用...

方法 #1:使用 preg_match() & 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 行
$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() 得到数组中的 "vertical" 个值。

当前此页面上的所有其他答案都在每次迭代中使用 explode() 调用。随着输入规模的增长,这种方法变得越来越低效。因此,将所有 exploding/splitting 执行一次并从那里继续前进会更有效率。

方法#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);