【问题标题】:Broke string into vars with variable position将字符串分解为具有可变位置的变量
【发布时间】:2020-07-07 02:54:49
【问题描述】:

我需要将一个字符串分解成一些变量,但它的顺序并不像例子那样固定:

$string = "name='John';phone='555-5555';city='oakland';";
$string2 = "city='oakland';phone='555-5555';name='John';";
$string3 = "phone='555-5555';name='John';city='oakland';";

所以我需要将字符串分解成:

$name
$phone
$city

如果位置是固定的,我可以使用 explode 并调用我需要的数组键

$brokenString = explode("'",$string);

$name = $brokenString[1];
$phone = $brokenString[3];
$city = $brokenString[5];

但是我怎么能用可变位置来做到这一点??

【问题讨论】:

    标签: php arrays string explode


    【解决方案1】:

    使用sort 的一种方法可以使所有字符串变量的位置始终相同。

    <?php
    $string = "name='John';phone='555-5555';city='oakland';";
    $string2 = "city='oakland';phone='555-5555';name='John';";
    $string3 = "phone='555-5555';name='John';city='oakland';";
    $array = explode(';',$string3);
    sort($array);
    $array = array_filter($array); # remove the empty element
    foreach($array as $value){
        $split = explode('=',$value);
        $result[$split[0]] = $split[1]; 
    }
    extract($result); # extract result as php variables
    echo "\$city = $city; \$name = $name; \$phone = $phone";
    ?>
    

    编辑:因为使用extract() 通常不是一个好主意。您可以使用简单的foreach() 代替extract()

    foreach($result as $k => $v) {
      $$k = $v;
    }
    

    工作演示: https://3v4l.org/RB8pT

    【讨论】:

    • @NigelRen 同意先生。还添加了一个编辑版本。
    【解决方案2】:

    可能有一个更简单的方法,但我所做的是创建一个数组$stringVariables 来保存分解的字符串。

    然后循环遍历该数组,并在分解后的字符串数组中的每个元素中使用strpos,以查看它是否包含“城市”、“电话”或“姓名”。根据哪一个,它被添加到一个包含所有姓名、城市或电话号码的数组中。

    $stringVariables = array();
    $phones = array();
    $names = array();
    $cities = array();
    $stringVariables[] = explode(";",$string);
    $stringVariables[] = explode(";",$string2);
    $stringVariables[] = explode(";",$string3);
    foreach($stringVariables as $stringVariable) {
       foreach($stringVariable as $partOfString) {
          if(strpos($partOfString, "name=") !== false) {
             $names[] = $partOfString;
          }else if(strpos($partOfString, "city=") !== false) {
             $cities[] = $partOfString;
          }else if(strpos($partOfString, "phone=") !== false) {
             $phones[] = $partOfString;
          }
       }
    }
    

    【讨论】:

      【解决方案3】:

      另一种方法是将其转换为可以解析为 URL 字符串的内容。

      第一部分是使用正则表达式('([^']+)'; 查找 '' 后跟 ;)从 'John',John&amp; 更改值和,然后解析结果(使用parse_str())...

      $string = "name='John';phone='555-5555';city='oakland';";
      $string = preg_replace("/'([^']+)';/","$1&", $string);
      echo $string.PHP_EOL;
      
      parse_str( $string, $values );
      
      print_r($values);
      

      给出的输出

      name=John&phone=555-5555&city=oakland&
      Array
      (
          [name] => John
          [phone] => 555-5555
          [city] => oakland
      )
      

      或者只是使用正则表达式...

      preg_match_all("/(\w*)?='([^']+)';/", $string, $matches);
      
      print_r(array_combine($matches[1], $matches[2]));
      

      【讨论】:

        猜你喜欢
        • 2020-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-30
        • 1970-01-01
        • 2015-09-02
        • 2020-12-05
        相关资源
        最近更新 更多