2017-03-29 9 views
-1

私は文章を含む文字列を持っています。これらの文を1つの配列に分割し、空の配列項目を削除するなど、各配列項目を変更したいと考えています。ここでPHP unsetが正しく動作していない配列から空の値を削除します。

は、私が持っているものです。

//Explode string by dot 
$items_array = explode(".", $raw_data); 

//Loop through the array 
foreach ($items_array as $i => $item) { 

    //Remove any whitespace at front of item 
    $item= ltrim($item); 

    //Check if array item is empty and unset 
    if($item === NULL){ 
    unset($items_array[$i]); 
    } 

    //Reinstate the dot 
    $item .= '.'; 
} 

しかし、これは動作しません。私は余分な 'を参照してください。私がprint(strlen($item));をループ内に置いた場合(設定されていない場合)、私はいくつかの結果を表示します0結果。

私は条件が、私はそこにプリントを入れたのであれば、それは例えば、0現れ回の同じ量をトリガーする満たされているかどうかを知る:

if($item === NULL){ 
     print("no value"); 
     unset($raw_inclusions[$i]); 
    } 

は、私はここで何か間違ったことをしたのでしょうか。

例$ raw_data文字列。私はここに置かれているものを支配しないと仮定します。

$raw_data = "Brown fox. Lazy dog." 

期待/望まれる結果:

$items_array = array("Brown fox.", "Lazy dog."); 

現在の結果:

$items_array = array("Brown fox.", "Lazy dog.", "."); 
+0

を私たちにあなたの例を与えるために各アイテムを持っているマップと何あなたがプログラムを実行すると思われます。 – mbouzahir

+0

@mbouzahir above – MeltingDog

+1

'$ item'は' $ item = ltrim($ item); 'の後の文字列になりますので、後で' $ item === NULL'は決して真ではありません。ループの最後にある '$ item。= '。';'行は、参照を使ってループしない限り、 '$ items_array'には影響しません。 – faintsignal

答えて

1

それはあなただけのコード

あなたのコードの1行が欠落している、実際には非常に簡単ですのようになります動作するように

if($item === NULL){ 
    unset($items_array[$i]); 
} 
//Reinstate the dot 
$item .= '.'; 

これにする

if($item === NULL){ 
    unset($items_array[$i]); 
} 
else // <- The else is important 
//Reinstate the dot 
    $item .= '.'; 

そして、あなたはこの行を必要とする、私はこれを行うだろう何かが

+0

まあまあ、あなたは正しい!ありがとう – MeltingDog

0

あなたが達成したいのか不明であるが、以下では、さらにあなたを助けるかもしれません。

$raw_data = "Brown fox. Lazy dog."; 
$items_array = preg_split('/(?<=[.?!])\s+(?=[a-z0-9])/i', $raw_data); 

$sentences = new ArrayIterator($items_array); 
for ($sentences->rewind(); $sentences->valid(); $sentences->next()) { 
    // Do something with sentence 
    print $sentences->current() . "\n"; 
} 

そして、あなたのアプローチは、それが

//Explode string by dot 
$items_array = explode(".", $raw_data); 

//Loop through the array and pass sentence by reference 
foreach ($items_array as $i => &$item) { 

    //Remove any whitespace at front of item 
    $item = ltrim($item); 

    //Check if array item is empty and unset (and continue) 
    if(empty($item)){ 
    unset($items_array[$i]); 
    continue; 
    } 
    // Reinstate the dot 
    $item .= '.'; 
} 
0

(元のコードを含む)動作させるための

$items_array[$i] = $item; 

$items_array = array_map(function($v) { return ltrim($v).'.'; }, 
         array_filter(explode('.', $raw_data))); 
  • .
  • に爆発します
  • フィルタの空のアイテム
  • トリムおよび追加.
関連する問題