PHP多维数组获取逗号分隔的字符串值

3

我有以下的数组结构:

[prod_prop] => Array
        (
            [45375] => Array
                (
                    [0] => 129|3|Mid-length
                )

            [45374] => Array
                (
                    [0] => 130|3|Long
                    [1] => 129|3|Mid-length
                )

            [45373] => Array
                (
                    [0] => 131|3|
                    [1] => 130|3|Long
                    [2] => 129|3|Mid-length
                )

        )

我希望能循环遍历每个父级数字,并输出第二层数组的第一部分的逗号分隔字符串。所以,如何为每个数字获取一个分隔值,使得期望结果如下:
45375 -> 返回129
45374 -> 返回130, 129
45373 -> 返回131, 130, 129
这是我目前的代码,它返回逗号分隔数组中的所有内容,而不是我要的东西:
 foreach($_POST['prod_prop'] AS $prop_ids) {
            $list = implode(",",$prop_ids);    
            echo $list;
        }

返回结果: 131|3|131|3|,130|3|长131|3|,130|3|长,129|3|中等长度131|3|,130|3|长,129|3|中等长度


2
那就去试试吧!也许你会惊喜的 :D - Rizier123
我已经尝试过了,但不确定如何识别数组第二层中的值?对于每个顶级循环,我可以很好地循环。 - davey
1
那就展示一下你的尝试吧! - Rizier123
嗯,我想我看到了我的错误!每个元素已经是一个带有 | 分隔符的字符串,这应该是另一个数组。 - davey
这肯定会让编码更容易。 - Rizier123
6个回答

2
foreach ($_POST['prod_prop'] as $prop_ids) {
    $list = join(',', array_map(
        function ($id) { return current(explode('|', $id)); },
        $prop_ids
    ));    
    echo $list;
}

这个代码很好用,但是我应该使用子数组来代替在包含 | 的字符串上分裂。谢谢。 - davey
这个到底是怎么工作的?map到包含|的元素吗? - davey
array_map与$res = array(); foreach ($arr as $i) $res[] = func($i);相同,其中func是上面给出的函数。尝试一下它。 - deceze
最后一个问题,我正在努力获取父KEYs 45375、45374、45373等。尝试使用key($_POST['prod_prop']),但它仍然停留在第一个key? - davey
foreach ($_POST['prod_prop'] as $key => $prop_ids) - deceze

0
您可以使用以下函数进行归档:- end()explode()trim()。请使用下面的代码。
$last = end($_POST['prod_prop']);
 foreach($_POST['prod_prop'] AS $prop_ids) {
foreach($prop_ids as $s){
$list .= ",".explode("|",$s)[0];
}
if($prop_ids==$last){
echo trim($list,",")."";
}
else{
echo trim($list,",").",";
}


        }

亲自尝试一下吧。希望这能对你有所帮助。


这并不是我想要的结果,它返回了:131|3|131|3|,130|3|长131|3|,130|3|长,129|3|中等长度 131|3|,130|3|长,129|3|中等长度。 - davey
@darvey 这只是一个提示,如果你想要你想要的结果,请使用implode和explode。等待发布你的答案。 - Utkarsh Dixit
@darvey 更新了我的回答...也许这就是你想要的。 - Utkarsh Dixit

0
为什么不遍历数组,implode()其值,并对其应用正则表达式呢?
$res = Array();
foreach($_POST["prod_prop"] as $bID=>$bLists) {

   $str = implode(",", $bLists); // get list of values comma separated

   preg_match_all("/(^|,)(\d+)/", $str, $m); //get all digits, which follow string start or comma

   if (Count($m[1])) { // if value found - store it in $res array
      $res[$bID] = implode(",", $m[1]);
   }
}

一个注意点:我不确定PHP中正则表达式的语法。在JavaScript中,以下内容是有效的。

var str = "131|3|,130|3|Long,129|3|Mid-length";
$('#result').html(str.match(/(^|,)(\d+)/g));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<span id="result"></span>


0

这似乎是 array_reduce 的一个很好的使用案例。试试这个:

foreach($_POST['prod_prop'] as $id => $properties) {

    $result = array_reduce($properties, function($val, $item) {

        return $val . ',' . substr($item, 0, strpos($item, '|'));
    });

    echo $result;
}

0

使用迭代调用strtok()在每个子数组上进行调用,以隔离第一个管道符号之前的子字符串,然后implode()截断的元素,然后再输出。

foreach ($_POST['prod_prop'] as $prop_ids) {
    echo implode(',', array_map(fn($v) => strtok($v, '|'), $prop_ids)) . '<br>';
}

-1
> $stateId = Array (
>     [0] => Array
>         (
>             [id] => 9
>             [state_id] => 81
>             [rto_id] => 82
>             [is_active] => 1
>         )
>     [1] => Array
>         (
>             [id] => 10
>             [state_id] => 82
>             [rto_id] => 83
>             [is_active] => 1
>         )
> 
> );
> 
> $stateIds = implode(",", array_column($stateId, "state_id"));
> 
> echo $stateIds;
> 
> 
> ***Result : 81,82***

通常在代码中包含某种解释会提高答案的质量。 - Joey Harwood
请解释一下你做了什么,这样提问者就知道你做了什么。 - creyD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接