删除平面数组中下一个元素不是价格值的元素

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

我有大量抄袭的名称和价格,类似于以下内容:

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()
来执行此操作。

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

php arrays filtering currency
8个回答
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;
    }
}

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 );

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


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
;)


0
投票

如果不重新格式化,我认为您无法使用

preg_match
preg_replace
来完成此操作 - 也许,但什么也没有想到。

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

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

那么

array_filter($array)
就是您清理它所需要的一切。如果您无法改变原始数组的创建方式,我倾向于从原始数组中创建键/值数组。


0
投票

只需这样做:

  <?php
for($i=0;$i<count($my_array);$i++)
{
if($my_array[$i+1]value=="")
unset($my_array[$i])
}
?>

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];
    }
}

0
投票

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

基本上是搜索存在空价格的上下文并插入零英镑。


0
投票

对于代码的人类读者来说,有条件地将元素对推入结果数组并保留原始键可能会更清楚,而不是

unset()
ing。

代码:(演示

$array = ['apple3', '£0.40', 'banana6', '£1.80', 'lemon', 'grape', 'pear5', 'melon4', '£2.32', 'kiwi', '£0.50'];

$result = [];
foreach ($array as $i => $v) {
    if (mb_substr($v, 0, 1) === '£') {
        $result[$i - 1] = $array[$i - 1];
        $result[$i] = $v;
    }
}
var_export($result);
© www.soinside.com 2019 - 2024. All rights reserved.