PHP数组不一致?

时间:2015-03-06 02:29:00

标签: php arrays skip

我有一些代码通过array_push()将值推送到PHP数组中。但是,当我在数组上执行print_r()时,它会跳过一个键,结果如下所示:

Array ( 
  [0] => appease 
  [1] => cunning 
  [2] => derisive 
  [3] => effeminate 
  [4] => grievance 
  [5] => inadvertently miscreants 
  [7] => ominous 
  [8] => resilient 
  [9] => resolute 
  [10] => restrain 
  [11] => superfluous 
  [12] => trudged 
  [13] => undiminished 
)

如您所见,它跳过第6个值,然后转到下一个值。但是出于某种原因,如果我在数组上调用foreach()方法,它会在" grievance"或索引4之后停止。有人知道它为什么会这样做吗?

编辑:如果我echo $words[6],它会正确打印第6个索引的值。

编辑2:这是我的代码:

$return = file_get_contents($target_file);
$arr = explode('<U><B>', $return);
$a = 1;

$words = [];

foreach($arr as $pos) {
    $important = substr($arr[$a], 0, 20);
    $arr2 = explode("</B></U>",$important);
    array_push($words,strtolower(trim($arr2[0])));
    $a++;
} 

该文件的内容是:

<U><B>appease</B></U><U><B>cunning</B></U><U><B>derisive</B></U><U><B>effeminate</B></U><U><B>grievance</B></U><U><B>inadvertently</B></U><U><B>miscreants</B></U><U><B>ominous</B></U><U><B>resilient</B></U><U><B>resolute</B></U><U><B>restrain</B></U><U><B>superfluous</B></U><U><B>trudged</B></U><U><B>undiminished</B></U>

*删除了一些不相关的文件内容以便于阅读

4 个答案:

答案 0 :(得分:1)

我写了一些更简单的东西:

<?php
$return="<U><B>appease</B></U><U><B>cunning</B></U><U><B>derisive</B></U><U><B>effeminate</B></U><U><B>grievance</B></U><U><B>inadvertently</B></U><U><B>miscreants</B></U><U><B>ominous</B></U><U><B>resilient</B></U><U><B>resolute</B></U><U><B>restrain</B></U><U><B>superfluous</B></U><U><B>trudged</B></U><U><B>undiminished</B></U>";

$arr = explode('<U><B>', $return);


$words = [];

foreach($arr as $pos) {
    if(!empty($pos)){
    $words[]=strip_tags($pos);
    }
} 


echo '<pre>';
print_r($words);

演示:http://codepad.viper-7.com/XeUWui

答案 1 :(得分:0)

$arr = "<U><B>appease</B></U><U><B>cunning</B></U><U><B>derisive</B></U><U><B>effeminate</B></U><U><B>grievance</B></U><U><B>inadvertently</B></U><U><B>miscreants</B></U><U><B>ominous</B></U><U><B>resilient</B></U><U><B>resolute</B></U><U><B>restrain</B></U><U><B>superfluous</B></U><U><B>trudged</B></U><U><B>undiminished</B></U>";

$arr = explode('<U><B>', $arr);
$a = 1;

foreach($arr as &$pos) 
{        
   if(!empty($pos))
   {
      $pos = str_replace("</B></U>","",$pos);   
   }
} 

print_r(array_filter($arr));

答案 2 :(得分:0)

可能有点矫枉过正,但总有SimpleXml

$arr = "<U><B>appease</B></U><U><B>cunning</B></U><U><B>derisive</B></U><U><B>effeminate</B></U><U><B>grievance</B></U><U><B>inadvertently</B></U><U><B>miscreants</B></U><U><B>ominous</B></U><U><B>resilient</B></U><U><B>resolute</B></U><U><B>restrain</B></U><U><B>superfluous</B></U><U><B>trudged</B></U><U><B>undiminished</B></U>";
$xml = new SimpleXmlElement('<root>' . $arr . '</root>');
$words = $xml->xpath('//B');

foreach ($words as $i =>$word) {
  printf("%d.\t%s\n", $i+1, $word);
}

答案 3 :(得分:0)

使用正则表达式非常简单:

<?php

$words = "<U><B>appease</B></U><U><B>cunning</B></U><U><B>derisive</B></U><U><B>effeminate</B></U><U><B>grievance</B></U><U><B>inadvertently</B></U><U><B>miscreants</B></U><U><B>ominous</B></U><U><B>resilient</B></U><U><B>resolute</B></U><U><B>restrain</B></U><U><B>superfluous</B></U><U><B>trudged</B></U><U><B>undiminished</B></U>";

preg_match_all("#<U><B>(.*?)</B></U>#",$words,$matches);

print_r($matches[1]);
?>

Fiddle here