我有大量抄袭的名称和价格,类似于以下内容:
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()
来执行此操作。
最重要的因素是需要保持水果和价格的顺序,以便我在稍后阶段将其转换为水果和价格的关联数组。
为什么要涉及正则表达式?这可以通过一个简单的
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;
}
}
下面的代码可以同时完成两项任务:去掉没有价值的水果,并将结果转换为水果与价格的关联数组。
$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 );
首先将数组转换为字符串,以'#'分隔。正则表达式捕获所有带有价格的水果组 - 每个水果组都作为单独的子组存储在结果中。将它们组合成关联数组是一个函数调用。
这样的事情可能会对你有帮助
$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
;)
如果不重新格式化,我认为您无法使用
preg_match
或 preg_replace
来完成此操作 - 也许,但什么也没有想到。
什么是创建该数组的?如果可能的话,我会把它改得更像:
Array([apple] => £0.40 [banana] => £1.80 [lemon] => [grape] => '' [pear ] => '' [melon => £2.32 [kiwi] => £0.50)
那么
array_filter($array)
就是您清理它所需要的一切。如果您无法改变原始数组的创建方式,我倾向于从原始数组中创建键/值数组。
只需这样做:
<?php
for($i=0;$i<count($my_array);$i++)
{
if($my_array[$i+1]value=="")
unset($my_array[$i])
}
?>
假设
$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];
}
}
尝试将模式 ** => ([a-zA-Z])** 替换为 ** => £0.00 $1**
基本上是搜索存在空价格的上下文并插入零英镑。
对于代码的人类读者来说,有条件地将元素对推入结果数组并保留原始键可能会更清楚,而不是
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);