【问题标题】:Explode string by multiple delimiters into multi-dimensional array php通过多个分隔符将字符串分解成多维数组php
【发布时间】:2013-04-16 11:57:41
【问题描述】:

有人可以帮我把这个爆炸函数递归吗?我的头今天不工作。

function expl($str,$charlist='|'){
    $charlist = str_split($charlist);
    foreach($charlist as $char){
        if(is_array($str)){
            for($i=0; $i<sizeof($str); $i++){
                $str[$i] = expl($str[$i],$char);
            }
        }else{
            return (explode($char,trim($str,$char)));
        }
    }
    return($str);
}
echo "<pre>";
print_r(expl("A~a1~a2|B~b1~b2",'|~'));
echo "</pre>";

应该输出:

Array
(
[0] => Array
    (
        [0] => A
        [1] => a1
        [2] => a2
    )
[0] => Array
    (
        [0] => B
        [1] => b1
        [2] => b2
    )
)

【问题讨论】:

    标签: php arrays multidimensional-array


    【解决方案1】:
    <?php
    
    function expl($str, $charlist = '|')
    {
        if (!$charlist) {
            return $str;
        }
        $char = $charlist[0];
        $matrix = explode($char, $str);
        for ($i = 0; $i < sizeof($matrix); $i++) {
            $matrix[$i] = expl($matrix[$i], substr($charlist, 1));
        }
        return $matrix;
    }
    echo "<pre>";
    print_r(expl("A~a1~a2|B~b1~b2", '|~'));
    echo "</pre>";
    

    应该是这样的... 使用递归! 第一级会得到第一个矩阵,做这样的事情

    $matrix[0] = "A~a1~a2";
    $matrix[1] = "B~b1~b2";
    

    然后,递归将执行第二部分,这将使每个字符串成为字符串数组,这将成为字符串数组,直到没有更多的分隔符。

    【讨论】:

    • 顺便说一句...我还没有测试过!这只是一个算法的想法!
    • 谢谢 Magnus - 这正是我试图用我的功能做的。我已经编辑了您的答案以清理示例中的语法,但我仍然认为它不正确。我在某个地方犯了错误吗?它输出类似 Array(0=>Array(0=>'~'))
    • 太好了 - 我发现了问题并更新了您的答案。希望我的编辑会被同行接受
    【解决方案2】:

    下面是一个工作示例,我提供了一个链接来显示函数运行时的输出:

    返回示例:

    http://phpfiddle.org/api/run/4iz-i2x

    用法:

    echo '<pre>';
    print_r( expl("A~a1~a2|B~b1~b2",'|~'));
    echo '</pre>';
    

    功能:

    <?php
    
    function expl($str,$charlist='|', $currentChar = 0, $continue = true){
    
        if(!$continue)
        {
            return $str;
        }
    
        $endArray = array();
    
        if($currentChar == 0){
            $charlist = str_split($charlist);
        }
        else
        {
            if($currentChar > count($charlist))
            {
                return expl($str, $charlist, $currentChar, false);
            }
        }
    
        if(!is_array($str))
        {   
            $pieces = explode($charlist[$currentChar], $str);
            $currentChar++;
            return expl($pieces, $charlist, $currentChar);
        }
        else{
            foreach($str as $arrayItem){
            if(is_array($arrayItem))
            {
                    return expl($str, $charlist, $currentChar, false);
            }
    
            $endArray[] = explode($charlist[$currentChar], $arrayItem);
    
            }
    
    
            $currentChar++;
            return expl($endArray, $charlist, $currentChar);                
        }               
    }    
    
    ?>
    

    【讨论】:

    • 谢谢埃文 - 它确实有效。感觉有点复杂,但由于我对如何简化它没有任何想法,我想它现在会做得很好。
    • @cronoklee 好的,是的,我同意你的观点,但我急于构建这个。也许你可以改进它:)
    【解决方案3】:

    简单地这样做。首先用'|'爆炸然后通过'〜'。它应该是这样的:

    $str="A~a1~a2|B~b1~b2";
    $arr=explode("|",$str);
    $result=array();
    foreach($arr as $k=>$v)
    {
      $arr1=explode("~",$v);
      $result[]=$arr1;
    }
    

    【讨论】:

    • 感谢 Gerry,但我们的想法是自动化它,这样您就可以拥有动态分隔符
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-30
    • 2015-08-18
    • 2011-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多