将每行有两个分隔符的多行字符串解析为关联行数组

问题描述 投票:0回答:3

我资助了一些帖子将数据分解为数组,但我的有点具体,因为数据有两部分

我有这个

title=Title1|link=Link1
title=Title2|link=Link2

我需要的结果是这样的

Array
(
    [0] => Array
        (
            [title] => Title1
            [link] => Link1
        )

    [1] => Array
        (
            [title] => Title2
            [link] => Link2
            
        )

)

数据来自 texarea 分隔 所以您看到的数据是实际数据。

php arrays multidimensional-array text-parsing
3个回答
6
投票
preg_match_all('~^title=(.+)\|link=(.+)$~m', $text, $reg, PREG_SET_ORDER);

print_r($reg)
产生

Array
(
    [0] => Array
        (
            [0] => title=Title1|link=Link1
            [1] => Title1
            [2] => Link1
        )

    [1] => Array
        (
            [0] => title=Title2|link=Link2
            [1] => Title2
            [2] => Link2
        )

)

我确信您可以轻松修改它以适合您所需的架构。


2
投票

当你实际上不需要正则表达式时,我更喜欢

explode()
而不是
preg_match()

<?php

$text="title=Title1|link=Link1\ntitle=Title2|link=Link2";

$result=array();
$count=0;

// line by line...
foreach (explode("\n", $text) as $line) {
  // variable by variable...
  foreach (explode("|", $line) as $vars) {
    // separate LHS from RHS.
    $parts=explode("=", $vars);
    $result[$count][$parts[0]]=$parts[1];
  }
  $count++;
}

print_r($result);

?>

不要忘记添加代码来处理与您期望的模式不匹配的行。 输入验证很重要。


1
投票

也许像这样,它有点冗长,但你应该能够使用它作为更优雅的东西的基础。

<?
$result=array();

foreach ($line in $iterable_variable_with_one_line_per_iteration){
    $subresult=array();
    foreach ($kv_pair in explode($line,"|")){
          $kv_pair_2 = explode($kv_pair,"=");
          $subresult[kv_pair_2[0]]=$kv_pair_2[1];
    }
    array_push($result,$subresult);
}
?>
© www.soinside.com 2019 - 2024. All rights reserved.