codeigniter 分解逗号和竖线上的字符串以创建两个数组

eqzww0vc  于 2022-12-07  发布在  其他
关注(0)|答案(3)|浏览(105)

我做了如下编码,得到了错误的输出:

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

如何创建这两个数组?

fsi0uk1n

fsi0uk1n1#

你可以试试这个

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

qni6mghb

qni6mghb2#

我希望这能帮助你,这里我用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);
zpgglvta

zpgglvta3#

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

方法#1:使用preg_match()和数组解构的一行程序:

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

方法#2:3-使用preg_split()array_chunk()array_column()的衬管

$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')

我的第一个方法使用lean regex模式来提取list()容易设置为变量的值。list()的前导逗号意味着$m的第一个子数组(完整的字符串)不会被分配变量名。
我的第二个方法使用lean regex模式,在同一步骤中分解竖线和逗号上的字符串。array_chunk()将元素成对放置。最后array_column()获得数组中的“vertical”值。
本页上的所有其他答案都是在每次迭代中使用explode()调用。随着输入大小的增加,这种方法的效率越来越低。因此,执行一次所有分解/拆分并从那里继续进行会更有效率。
方法1显然是我最喜欢的方法;我只想展示方法#2作为一种替代方法,它也在处理片段之前解剖字符串一次。
下面是一些其他方法,它们的行为类似于其他答案中的foreach循环(它们也有同样的低效率问题,因为它们在每次迭代时都调用explode()):
array_map()可以用来编写一行代码:

$asst_vicars_data = 'PT|1,O|4,PT|15';
array_map(function($a) use(&$type, &$heads) { [$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) { [$type[], $heads[]] = explode('|', $a); });
var_export($type);
var_export($heads);

相关问题