【问题标题】:how to change string with delimiter into array?如何将带分隔符的字符串更改为数组?
【发布时间】:2011-03-19 05:10:21
【问题描述】:

我有这个字符串.........

0&39avfy;&39avfy;task&39avfy;rose&39avfy;duration&39avfy;1.25&39avfy;user&39avfy;15&39avfy;1&39avfy;&39avfy;task&39avfy;daisy&39avfy;duration&39avfy;0.75&39avfy;user&39avfy;25&39avfy;2&39avfy;&39avfy;task&39avfy;orchid&39avfy;duration&39avfy;1.15&39avfy;user&39avfy;7

我需要这样的数组............

array( 
               array( "task" => "rose", 
                      "duration" => 1.25,
                      "user" => 15 
                    ),
               array( "task" => "daisy", 
                      "duration" => 0.75,
                      "user" => 25,
                    ),
               array( "task" => "orchid", 
                      "duration" => 1.15,
                      "user" => 7 
                    )
             );

【问题讨论】:

  • 到目前为止你有什么,以及它是如何工作的。
  • 实际上它是一个带分隔符的编码数组......现在我想通过从字符串中删除分隔符来返回原始数组。
  • 你从哪里得到奇怪的字符串?它看起来与上一个版本相似。也许您可以使用str_replace('&39avfy;', '=', $str) 预先清理它。
  • 我对该数组进行了编码并转换为字符串。对于编码我使用了分隔符 $ab='&39avfy;';
  • 将字符串更改为数组的简单方法是爆炸式的,但要从中得到想要的结果需要更多的工作。

标签: php arrays string delimiter


【解决方案1】:

好吧,既然它是统一排序的,你可以使用这种方法:

 preg_match_all('#
                  task      &39avfy;  (?<task> [^&]*)  .*?
                  duration  &39avfy;  (?<duration> [^&]*) .*?
                  user      &39avfy;  (?<user> [^&]*)
              \K #x',
     $str, $matches, PREG_SET_ORDER);

它将有一些数字数组条目,但您可以将它们过滤掉。更重要的是,如果您的分隔符发生变化,这更容易适应。

print_r($matches);

[0] => Array
    (
        [0] => 
        [task] => rose
        [1] => rose
        [duration] => 1.25
        [2] => 1.25
        [user] => 15
        [3] => 15
    )

[1] => Array
    (
        [0] => 
        [task] => daisy
        [1] => daisy
        [duration] => 0.75
        [2] => 0.75
        [user] => 25
        [3] => 25
    )

【讨论】:

    【解决方案2】:

    至少这解决了你的问题。

    <?php
    
    $in = '0&39avfy;&39avfy;task&39avfy;rose&39avfy;duration&39avfy;1.25&39avfy;user&39avfy;15&39avfy;1&39avfy;&39avfy;task&39avfy;daisy&39avfy;duration&39avfy;0.75&39avfy;user&39avfy;25&39avfy;2&39avfy;&39avfy;task&39avfy;orchid&39avfy;duration&39avfy;1.15&39avfy;user&39avfy;7';
    
    $arr = explode('&39avfy;',$in);
    $out = array();
    $i = 0;
    foreach($arr as $a){
        switch ($i) {
            case 0:
                if(isset($tmp)) { $out[] = $tmp; }
                break;
            case 3:
                $tmp["task"] = $a;
                break;
            case 5:
                $tmp["duration"] = $a;
                break;
            case 7:
                $tmp["user"] = $a;
                break;
            default:
        }
        $i++;
        $i%=8;
    }
    if($i == 0 && isset($tmp)) { $out[] = $tmp; }
    var_dump($out);
    
    array(3) {
      [0]=>
      array(3) {
        ["task"]=>
        string(4) "rose"
        ["duration"]=>
        string(4) "1.25"
        ["user"]=>
        string(2) "15"
      }
      [1]=>
      array(3) {
        ["task"]=>
        string(5) "daisy"
        ["duration"]=>
        string(4) "0.75"
        ["user"]=>
        string(2) "25"
      }
      [2]=>
      array(3) {
        ["task"]=>
        string(6) "orchid"
        ["duration"]=>
        string(4) "1.15"
        ["user"]=>
        string(1) "7"
      }
    }
    

    此代码导致相同的结果:

    <?php
    
    $in = '0&39avfy;&39avfy;task&39avfy;rose&39avfy;duration&39avfy;1.25&39avfy;user&39avfy;15&39avfy;1&39avfy;&39avfy;task&39avfy;daisy&39avfy;duration&39avfy;0.75&39avfy;user&39avfy;25&39avfy;2&39avfy;&39avfy;task&39avfy;orchid&39avfy;duration&39avfy;1.15&39avfy;user&39avfy;7';
    
    $matches = array();
    $regex = '/(\\d)&39avfy;&39avfy;task&39avfy;(.+?)&39avfy;duration&39avfy;(\\d+\\.\\d+)&39avfy;user&39avfy;(\\d+)/';
    preg_match_all($regex, $in, $matches, PREG_SET_ORDER  );
    $out = array();
    foreach($matches as $m){
        $tmp = array();
        $tmp['task'] = $m[2];
        $tmp['duration'] = $m[3];
        $tmp['user'] = $m[4];
        $out[$m[1]] = $tmp;
    }
    var_dump($out);
    

    【讨论】:

      猜你喜欢
      • 2011-08-31
      • 2018-07-23
      • 2012-10-23
      • 2019-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-06
      • 1970-01-01
      相关资源
      最近更新 更多