【问题标题】:PHP: How to explode a string into an array every TWO seperators with key->value pairsPHP:如何使用键->值对每两个分隔符将一个字符串分解为一个数组
【发布时间】:2021-10-31 11:49: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,
)

等等等等……

我已经搞砸了将近一个小时,试图让它按照我需要的方式输出到一个数组中,但到目前为止进展并不顺利。

谁能帮忙?

【问题讨论】:

    标签: php arrays explode


    【解决方案1】:

    数据由一系列测量值组成,由数字分隔符分隔。每个测量值都有一个法语名称和一个公制值,后跟一个带有英制值的英文版本。 因此,我们需要从每个块中提取四个值,并将这四个值组合成一个数组的两行。

    explode() 有点简单,因为字段之间存在数字分隔符。正则表达式可以一次提取相关数据,然后我们只需将其组装成最终结果。

    这里的正则表达式包含四个捕获组来收集所需的数据,以及一个非捕获组作为分隔符。

    <?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

    【讨论】:

    • 这太棒了!正是我需要的,你解释得很好,这样我以后也可以利用它来满足其他需求。明天尝试自己解决这个问题时,可能还让我有些头疼。非常感谢!
    【解决方案2】:

    我曾经遇到过类似的问题。我使用了来自this answerarray_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" 
              }
    */
    ?>
    

    请注意,此方法仅适用于具有偶数条目的数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-26
      • 2021-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-06
      相关资源
      最近更新 更多