PHP:如何将一个字符串分解成一个数组,每隔两个带有键->值对的分隔符
PHP: How to explode a string into an array every TWO seperators with key->value pairs
我有这样的字符串:
$measurements = 'Hauteur/-/175 cm/-/Height/-/5'9''/-/00010/--/Buste (Femme)/-/92 cm/-/Bust (Women)/-/36''/-/00020/--/Taille/-/74 cm/-/Waist/-/29''/-/00022/--/Hanches/-/99 cm/-/Hips/-/39''/-/00023';
我可以使用以下方法将它分解成一个数组:
$measurements_array = explode("/-/", $measurements);
但是,我真正需要做的是在每第二次出现/-/时分解成一个键->值对。
输出应该是:
Array(
[Hauteur] => 185 cm,
[Height] => 6'1'',
[Hair / color] => Brown,
[Eyes] => Brown-Green,
)
等等……
我已经弄乱了将近一个小时,试图让它按照我需要的方式输出到数组中,但到目前为止进展不顺利。
有人能帮忙吗?
我曾经遇到过类似的问题。我使用了 this answer 中的 array_splice()
方法。
<?php
$measurements = "Hauteur/-/175 cm/-/Height/-/5'9''/-/00010/--/Buste (Femme)/-/92 cm/-/Bust (Women)/-/36''/-/00020/--/Taille/-/74 cm/-/Waist/-/29''/-/00022/--/Hanches/-/99 cm/-/Hips/-/39";
$measurements_array = explode("/-/", $measurements);
$result = array();
while (count($measurements_array)) {
list($key,$value) = array_splice($measurements_array, 0, 2);
$result[$key] = $value;
}
echo(var_dump($result));
/*
> Output: array(8) {
["Hauteur"]=> string(6) "175 cm"
["Height"]=> string(5) "5'9''"
["00010/--/Buste (Femme)"]=> string(5) "92 cm"
["Bust (Women)"]=> string(4) "36''"
["00020/--/Taille"]=> string(5) "74 cm"
["Waist"]=> string(4) "29''"
["00022/--/Hanches"]=> string(5) "99 cm"
["Hips"]=> string(2) "39"
}
*/
?>
请注意,此方法仅适用于条目数为偶数的数组。
数据由一系列测量值组成,由数字分隔符分隔。每个测量值都有一个法语名称和一个公制值,然后是带有英制值的英文版本。
因此,我们需要从每个块中提取四个值,并将这四个值组合成一个数组中的两行。
explode()
有点简单,因为字段之间存在数字分隔符。一个正则表达式可以一次提取相关数据,然后我们需要做的就是assemble将其放入最终结果。
这里的正则表达式包含四个捕获组来收集所需的数据,以及一个非捕获组作为分隔符。
<?php
$measurements = "Hauteur/-/175 cm/-/Height/-/5'9''/-/00010/--/Buste (Femme)/-/92 cm/-/Bust (Women)/-/36''/-/00020/--/Taille/-/74 cm/-/Waist/-/29''/-/00022/--/Hanches/-/99 cm/-/Hips/-/39''/-/00023";
$regex = "%(.*?)/-/(.*?)/-/(.*?)/-/(.*?)/-/\d{5}(?:/--/){0,1}%";
preg_match_all($regex, $measurements, $matches);
preg_match_all()
将数据提取到 $matches
数组中。我们得到一个这样的数组:
array(5) {
[0]=>
array(4) {
[0]=> string(45) "Hauteur/-/175 cm/-/Height/-/5'9''/-/00010/--/"
[1]=> string(55) "Buste (Femme)/-/92 cm/-/Bust (Women)/-/36''/-/00020/--/"
[2]=> string(41) "Taille/-/74 cm/-/Waist/-/29''/-/00022/--/"
[3]=> string(37) "Hanches/-/99 cm/-/Hips/-/39''/-/00023"
}
[1]=>
array(4) {
[0]=> string(7) "Hauteur"
[1]=> string(13) "Buste (Femme)"
[2]=> string(6) "Taille"
[3]=> string(7) "Hanches"
}
[2]=>
array(4) {
[0]=> string(6) "175 cm"
[1]=> string(5) "92 cm"
[2]=> string(5) "74 cm"
[3]=> string(5) "99 cm"
}
[3]=>
array(4) {
[0]=> string(6) "Height"
[1]=> string(12) "Bust (Women)"
[2]=> string(5) "Waist"
[3]=> string(4) "Hips"
}
[4]=>
array(4) {
[0]=> string(5) "5'9''"
[1]=> string(4) "36''"
[2]=> string(4) "29''"
[3]=> string(4) "39''"
}
}
我们可以忽略 $matches
的第一个元素,因为它包含每个完整的匹配项。我们对包含每个匹配组结果的其他四个元素感兴趣。
这些匹配组中的第一个包含法语名称,第二个包含度量值。第三个和第四个分别是英文版和英制版。
我们现在需要做的就是遍历数组,在新数组中创建正确的键和值:
$output = [];
for ($i = 0; $i<count($matches[0]);$i++) {
$output[$matches[1][$i]]=$matches[2][$i];
$output[$matches[3][$i]]=$matches[4][$i];
}
var_dump($output);
输出:
array(8) {
["Hauteur"]=>
string(6) "175 cm"
["Height"]=>
string(5) "5'9''"
["Buste (Femme)"]=>
string(5) "92 cm"
["Bust (Women)"]=>
string(4) "36''"
["Taille"]=>
string(5) "74 cm"
["Waist"]=>
string(4) "29''"
["Hanches"]=>
string(5) "99 cm"
["Hips"]=>
string(4) "39''"
}
我有这样的字符串:
$measurements = 'Hauteur/-/175 cm/-/Height/-/5'9''/-/00010/--/Buste (Femme)/-/92 cm/-/Bust (Women)/-/36''/-/00020/--/Taille/-/74 cm/-/Waist/-/29''/-/00022/--/Hanches/-/99 cm/-/Hips/-/39''/-/00023';
我可以使用以下方法将它分解成一个数组:
$measurements_array = explode("/-/", $measurements);
但是,我真正需要做的是在每第二次出现/-/时分解成一个键->值对。
输出应该是:
Array(
[Hauteur] => 185 cm,
[Height] => 6'1'',
[Hair / color] => Brown,
[Eyes] => Brown-Green,
)
等等……
我已经弄乱了将近一个小时,试图让它按照我需要的方式输出到数组中,但到目前为止进展不顺利。
有人能帮忙吗?
我曾经遇到过类似的问题。我使用了 this answer 中的 array_splice()
方法。
<?php
$measurements = "Hauteur/-/175 cm/-/Height/-/5'9''/-/00010/--/Buste (Femme)/-/92 cm/-/Bust (Women)/-/36''/-/00020/--/Taille/-/74 cm/-/Waist/-/29''/-/00022/--/Hanches/-/99 cm/-/Hips/-/39";
$measurements_array = explode("/-/", $measurements);
$result = array();
while (count($measurements_array)) {
list($key,$value) = array_splice($measurements_array, 0, 2);
$result[$key] = $value;
}
echo(var_dump($result));
/*
> Output: array(8) {
["Hauteur"]=> string(6) "175 cm"
["Height"]=> string(5) "5'9''"
["00010/--/Buste (Femme)"]=> string(5) "92 cm"
["Bust (Women)"]=> string(4) "36''"
["00020/--/Taille"]=> string(5) "74 cm"
["Waist"]=> string(4) "29''"
["00022/--/Hanches"]=> string(5) "99 cm"
["Hips"]=> string(2) "39"
}
*/
?>
请注意,此方法仅适用于条目数为偶数的数组。
数据由一系列测量值组成,由数字分隔符分隔。每个测量值都有一个法语名称和一个公制值,然后是带有英制值的英文版本。 因此,我们需要从每个块中提取四个值,并将这四个值组合成一个数组中的两行。
explode()
有点简单,因为字段之间存在数字分隔符。一个正则表达式可以一次提取相关数据,然后我们需要做的就是assemble将其放入最终结果。
这里的正则表达式包含四个捕获组来收集所需的数据,以及一个非捕获组作为分隔符。
<?php
$measurements = "Hauteur/-/175 cm/-/Height/-/5'9''/-/00010/--/Buste (Femme)/-/92 cm/-/Bust (Women)/-/36''/-/00020/--/Taille/-/74 cm/-/Waist/-/29''/-/00022/--/Hanches/-/99 cm/-/Hips/-/39''/-/00023";
$regex = "%(.*?)/-/(.*?)/-/(.*?)/-/(.*?)/-/\d{5}(?:/--/){0,1}%";
preg_match_all($regex, $measurements, $matches);
preg_match_all()
将数据提取到 $matches
数组中。我们得到一个这样的数组:
array(5) {
[0]=>
array(4) {
[0]=> string(45) "Hauteur/-/175 cm/-/Height/-/5'9''/-/00010/--/"
[1]=> string(55) "Buste (Femme)/-/92 cm/-/Bust (Women)/-/36''/-/00020/--/"
[2]=> string(41) "Taille/-/74 cm/-/Waist/-/29''/-/00022/--/"
[3]=> string(37) "Hanches/-/99 cm/-/Hips/-/39''/-/00023"
}
[1]=>
array(4) {
[0]=> string(7) "Hauteur"
[1]=> string(13) "Buste (Femme)"
[2]=> string(6) "Taille"
[3]=> string(7) "Hanches"
}
[2]=>
array(4) {
[0]=> string(6) "175 cm"
[1]=> string(5) "92 cm"
[2]=> string(5) "74 cm"
[3]=> string(5) "99 cm"
}
[3]=>
array(4) {
[0]=> string(6) "Height"
[1]=> string(12) "Bust (Women)"
[2]=> string(5) "Waist"
[3]=> string(4) "Hips"
}
[4]=>
array(4) {
[0]=> string(5) "5'9''"
[1]=> string(4) "36''"
[2]=> string(4) "29''"
[3]=> string(4) "39''"
}
}
我们可以忽略 $matches
的第一个元素,因为它包含每个完整的匹配项。我们对包含每个匹配组结果的其他四个元素感兴趣。
这些匹配组中的第一个包含法语名称,第二个包含度量值。第三个和第四个分别是英文版和英制版。
我们现在需要做的就是遍历数组,在新数组中创建正确的键和值:
$output = [];
for ($i = 0; $i<count($matches[0]);$i++) {
$output[$matches[1][$i]]=$matches[2][$i];
$output[$matches[3][$i]]=$matches[4][$i];
}
var_dump($output);
输出:
array(8) {
["Hauteur"]=>
string(6) "175 cm"
["Height"]=>
string(5) "5'9''"
["Buste (Femme)"]=>
string(5) "92 cm"
["Bust (Women)"]=>
string(4) "36''"
["Taille"]=>
string(5) "74 cm"
["Waist"]=>
string(4) "29''"
["Hanches"]=>
string(5) "99 cm"
["Hips"]=>
string(4) "39''"
}