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''"
}

演示:https://3v4l.org/i4mQM