php 从块文本中获取子字符串对,并形成关联数组

30byixjq  于 5个月前  发布在  PHP
关注(0)|答案(4)|浏览(38)

我如何过滤我的内容并在其他地方显示这些值。内容是通过XML加载的,由我们的客户端填充。因此我无法更改值。问题是我的值在不同的行上。我目前正在过滤一些值:

if (!empty($arraywithvalues)) {
    $array = explode("<br>", $arraywithvalues);
    foreach( $array as $key => $value){
        if (
            strpos(strtolower($value),'oppervlakte') !== FALSE ||
            strpos(strtolower($value),'perceel') !== FALSE ||
            strpos(strtolower($value),'golf') !== FALSE 
        ) {
            $filtered_content[] = $value;
            unset($array[$key]);
        }
    };

字符串
这是为了过滤掉文本位,这是成功完成的,可以在this website上看到。问题是仍然有一些值需要过滤掉,比如:
20 M2
20公里
然而,过滤本身是没有问题的。我遇到的问题是把一个和另一个旁边的值。所以,例如。距离高尔夫(* 第一过滤值 )-20公里( 第二过滤值 *)。我如何才能实现这一点?
XML导入时:

string(82)"

Bebouwde oppervlakte

80 M2

Terras oppervlakte

20 M2

Keuken oppervlakte

12 M2"

u5rb5r59

u5rb5r591#

PHP8

<?php

$values = <<<EOL

Bebouwde oppervlakte

80 M2

Terras oppervlakte

20 M2

Keuken oppervlakte

12 M2
EOL;

if (!$values) {
    // you can throw an exception and/or log etc.
    return;
}

$valueList = array_filter(explode(PHP_EOL, $values));
$valueList = array_values(array_map('trim', $valueList));

$formatedValueList = [];

foreach($valueList as $key => $value) {
    if ((
            str_contains(strtolower($value), 'oppervlakte')
            || str_contains(strtolower($value), 'perceel') 
            || str_contains(strtolower($value), 'golf')
        ) && (
            str_contains(strtolower($valueList[$key+1]), 'm2')
            || str_contains(strtolower($valueList[$key+1]), 'km')
        )
    ) {
        $formatedValueList[] = sprintf('%s - %s', $value, $valueList[$key+1]);
    }
}

var_dump($formatedValueList);

字符串

PHP7

<?php

$values = <<<EOL

Bebouwde oppervlakte

80 M2

Terras oppervlakte

20 M2

Keuken oppervlakte

12 M2
EOL;

if (!$values) {
    // you can throw an exception and/or log etc.
    return;
}

$valueList = array_filter(explode(PHP_EOL, $values));
$valueList = array_values(array_map('trim', $valueList));

$formatedValueList = [];

foreach($valueList as $key => $value) {
    if ((
            strpos(strtolower($value), 'oppervlakte') !== false
            || strpos(strtolower($value), 'perceel')  !== false
            || strpos(strtolower($value), 'golf') !== false
        ) && (
            strpos(strtolower($valueList[$key+1]), 'm2') !== false
            || strpos(strtolower($valueList[$key+1]), 'km') !== false
        )
    ) {
        $formatedValueList[] = sprintf('%s - %s', $value, $valueList[$key+1]);
    }
}

var_dump($formatedValueList);

输出

array(3) {
  [0]=>
  string(28) "Bebouwde oppervlakte - 80 M2"
  [1]=>
  string(26) "Terras oppervlakte - 20 M2"
  [2]=>
  string(26) "Keuken oppervlakte - 12 M2"
}

nbnkbykc

nbnkbykc2#

假设记录是按上面的顺序排列的,这是相当容易的。你缓冲第一行,然后保持阅读,直到第二个值的行到来。然后连接缓冲区和当前值。

if (!empty($arraywithvalues)) {
    $array = explode("<br>", $arraywithvalues);
    foreach( $array as $value){
        if ( strpos(strtolower($value),'oppervlakte') !== FALSE ||
             strpos(strtolower($value),'perceel') !== FALSE ||
             strpos(strtolower($value),'golf') !== FALSE            ) {
            $buffer = $value;
        } elseif ( strpos(strtolower($value),'m2') !== FALSE ||
                   strpos(strtolower($value),'km') !== FALSE       ) { 
            $filtered_content[] = $buffer . ' - ' . $value;
        }
    }
}

字符串

nhhxz33t

nhhxz33t3#

它有点草率,但我认为它完成了工作:

<?php

$stringArray = explode("\r\n", trim($arraywithvalues));
$stringArray = array_filter($stringArray);
$stringArray = array_values($stringArray);

$newArray = [];
foreach($stringArray as $key => $value) {
    if($key % 2 == 0)
        $newArray[$value] = '';
    else 
        $newArray[$stringArray[$key-1]] = $value;
}

//var_dump($newArray);

?>

字符串
最后你会得到一个key=>value的数组,像这样:

[
  "Bebouwde oppervlakte" => "80 M2"
  "Terras oppervlakte"   => "20 M2"
  "Keuken oppervlakte"   => "12 M2"
]


你可以循环通过它,并显示你想要的

inn6fuwd

inn6fuwd4#

因为你的示例输入文本只包含要保留的文本,所以只需要使用preg_match_all()来捕获连续的文本对,然后使用array_column()将这些文本对组成一个关联数组。

preg_match_all(
    '/(\S+(?: \S+)*)\s+(\S+(?: \S+)*)/',
    $text,
    $m,
    PREG_SET_ORDER
);
var_export(array_column($m, 2, 1));

字符串
输出量:

array (
  'Bebouwde oppervlakte' => '80 M2',
  'Terras oppervlakte' => '20 M2',
  'Keuken oppervlakte' => '12 M2',
)

相关问题