将字符串分解为具有可变位置的变量

Broke string into vars with variable position

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

$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];

但是我怎么能用可变位置呢?

一种方法是 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() 通常不是很好 idea.You 可以使用简单的 foreach() 而不是 extract()

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

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

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

然后遍历此数组,并在分解字符串数组中的每个元素中使用 strpos 以查看它是否包含 'city'、'phone' 或 'name' .根据哪一个,它被添加到一个数组中,该数组包含所有名称、城市或 phone 数字。

$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;
      }
   }
}

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

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

$string = "name='John';phone='555-5555';city='oakland';";
$string = preg_replace("/'([^']+)';/","&", $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]));