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

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

このようなものがあなたを助けるかもしれません

$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

これを行うだけです:

  <?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

$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 に答える