将字符串分解为具有可变位置的变量
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]));
我需要将一个字符串分成一些变量,但它的顺序并不固定,例如:
$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]));