1

我有大量类似于以下内容的抓取名称和价格:

Array([0] => apple3 [1] => £0.40 [2] => banana6 [3] => £1.80 [4] => lemon [5] => grape [6] => pear5 [7] => melon4 [8] => £2.32 [9] => kiwi [10] => £0.50)

我想删除没有紧跟价格的水果名称。在上面的示例中,这将删除:[4] => lemon [5] => grape [6] => pear5导致以下输出:

Array([0] => apple3 [1] => £0.40 [2] => banana6 [3] => £1.80 [7] => melon4 [8] => £2.32 [9] => kiwi [10] => £0.50)

如果需要将数组转换为字符串以便我执行此操作,这不是问题,也不是在数组项之间添加值以帮助进行正则表达式搜索。到目前为止,我一直无法使用 preg_match 和 preg_replace 找到正确的正则表达式来执行此操作。

最重要的因素是需要保持水果和价格的顺序,以便我在稍后阶段将其转换为水果和价格的关联数组。

提前致谢。

4

7 回答 7

4

为什么涉及正则表达式?这可以通过一个简单的循环来实现,在该foreach循环中迭代数组并删除名称后面的名称:

$lastWasPrice = true; // was the last item a price?
foreach ($array as $k => $v) {
    if (ctype_alpha($v)) {
        // it's a name
        if (!$lastWasPrice) {
            unset($array[$k]); // name follows name; remove the second
        }
        $lastWasPrice = false;
    }
    else {
        // it's a price
        $lastWasPrice = true;
    }
}
于 2012-10-16T19:33:21.197 回答
1

下面的代码同时完成了你的两个任务:去掉没有价值的水果,并将结果转换为水果与价格的关联数组。

$arr = array('apple', '£0.40', 'banana', '£1.80', 'lemon', 'grape', 'pear', 'melon', '£2.32', 'kiwi', '£0.50' );

preg_match_all( '/#?([^£][^#]+)#(£\d+\.\d{2})#?/', implode( '#', $arr ), $pairs );
$final = array_combine( $pairs[1], $pairs[2] );

print_r( $final );

首先,将数组转换为字符串,用“#”分隔。正则表达式捕获所有带有价格的水果组 - 每个都作为单独的子组存储在结果中。将它们组合成一个关联数组是一个函数调用。

于 2012-10-16T20:13:17.603 回答
0

只需这样做:

  <?php
for($i=0;$i<count($my_array);$i++)
{
if($my_array[$i+1]value=="")
unset($my_array[$i])
}
?>
于 2012-10-16T19:33:40.500 回答
0

这样的事情可能会帮助你

$array = ...;
$index = 0;

while (isset($array[$index + 1])) {
  if (!is_fruit($array[$index + 1])) {
    // Not followed by a fruit, continue to next pair
    $index += 2;
  } else {
    unset($array[$index]);  // Will maintain indices in array
    $index += 1;
  }
}

虽然没有测试。此外,您需要自己创建函数is_fruit;)

于 2012-10-16T19:35:59.223 回答
0

如果不重新格式化它,我认为你不能用preg_match或者preg_replace- 也许,但什么都没有想到。

什么是创建该数组?如果可能的话,我会把它改成更像:

Array([apple] => £0.40 [banana] => £1.80 [lemon] => [grape] => '' [pear ] => '' [melon  => £2.32 [kiwi] => £0.50)

然后array_filter($array)就是你需要清理它的所有内容。如果你不能改变原始数组的创建方式,我倾向于从原始数组中创建键/值数组。

于 2012-10-16T19:37:36.487 回答
0

尝试将模式 ** => ([a-zA-Z])** 替换为 ** => £0.00 $1**

基本上是在寻找零价格并插入零磅的上下文。

希望这可以帮助。

祝你好运

于 2012-10-16T19:39:41.373 回答
0

假设$a是你的数组。

function isPrice($str) {
    return (substr($str, 0, 1) == '£');
}
$newA = array();
for($i=0;$i<count($a);$i++) {
    if( isPrice($a[$i]) != isPrice($a[$i+1]) ){
        $newA[] = $a[$i];
    }
}
于 2012-10-16T20:30:07.457 回答