【问题标题】:php array woes when parsing a string解析字符串时的php数组问题
【发布时间】:2015-07-08 20:25:39
【问题描述】:

我在 PHP 中循环一个字符串数组。具体来说,我在每个数组行(..)中寻找双点。如果没有找到点,则将整行附加到第二个数组行。如果找到,那么我将行拆分,将左半部分放在当前(第二个)数组行中,将右半部分放在 next 行中。

这是我目前所拥有的:

$fudgedindex = 0;
$parsedrows = array('');

foreach($refinedlist as $rowtoparse)
{
    $pos2 = strpos($rowtoparse, "..");

    //echo $refinedlist[$index] . "<br>";
    if ($pos2 === false)
    {
        $parsedrows[$fudgedindex] = $parsedrows[$fudgedindex] . $rowtoparse;
    }
    else
    {
        $length = strlen($rowtoparse);
        $partialleft = substr($rowtoparse, 0, $pos2);
        $partialright = substr($rowtoparse, $pos2);
        $parsedrows[$fudgedindex] = $parsedrows[$fudgedindex] . $partialleft;
        $fudgedindex = $fudgedindex + 1;
        $parsedrows = '';

        $parsedrows[$fudgedindex] = $parsedrows[$fudgedindex] . $partialright;
    }
}

在增加 $fudgedindex 后,我不断得到未定义的索引。

自从我使用 PHP 以来已经有一段时间了,我觉得我要么想多了,有点过于程序化,要么犯了一个令人头疼的错误。

任何帮助表示赞赏!再次感谢您抽出宝贵时间提供帮助。 =)

编辑:根据 cmets,这就是我的目标......

$refinedlist[0]="Today I bought milk..Then I went to the "
[1]="store and bought even more food "
[2]="such as apples..I was happy..Then"
[3]=" I went to stackoverflow.com and asked this question "
[4]="to solve my problem.."

结果应该是:

$parsedrows[0]="Today I bought milk"
[1]="Then I went to the store and bought even more food such as apples"
[2]="I was happy."
[3]="Then I went to stackoverflow.com and asked this question to solve my problem"

编辑 2:错误消失了,因此最初的问题已修复。但是,当我运行这个之后:

foreach($parsedrows as $rowtoprint)
{
    echo $rowtoprint . "<br>";
}

只显示最后一行。

【问题讨论】:

  • 你能举一个$refinedlist中的3-5个值和$parsedrows的预期结果的例子吗?
  • mseifert 已经回答了您的问题。所以有时间问一下你当前问题背后的问题:$refinedlist 的来源是什么?
  • 您的问题得到解答了吗?
  • 第一个问题,是的(谢谢!)。我为我得到的最终 $parsedrows 错误添加了第二个编辑。
  • 查看我的更新答案以解决您的编辑问题。当一行中有两个.. 时,需要再进行一次修复。正在努力。

标签: php arrays


【解决方案1】:

你的问题是

    $parsedrows[$fudgedindex] = $parsedrows[$fudgedindex] . $partialright;

您增加了$fudgedindex 并正在使用此语句设置一个新的数组元素。然而,您还引用了这个尚不存在的新元素(= 的右侧) - 导致错误。

你应该说

    $parsedrows[$fudgedindex] = $partialright;

因为它是下一行的开始。

您的第二个问题开始于注意到您正在重新初始化 $parsedrows 并清除所有以前的数组元素。你需要删除$parsedrows = '';

但是,由于您可以在一行中包含多个“..”,因此您需要包含一个循环来处理每一行,直到完成。我不得不重写整个事情来完成这个。这会产生你想要的结果

<?php

$refinedlist[0]="Today I bought milk..Then I went to the ";
$refinedlist[1]="store and bought even more food ";
$refinedlist[2]="such as apples..I was happy..Then";
$refinedlist[3]=" I went to stackoverflow.com and asked this question ";
$refinedlist[4]="to solve my problem..";

$fudgedindex = 0;
$parsedrows = array('');

foreach($refinedlist as $rowtoparse)   
{
    while (($pos2 = strpos($rowtoparse, "..")) !== false)
    {
        $length = strlen($rowtoparse);
        $partialleft = substr($rowtoparse, 0, $pos2);

        // keep what is not yet processed in the original var
        // while loop will process again
        $rowtoparse = substr($rowtoparse, $pos2 + 2);

        // add to current row
        $parsedrows[$fudgedindex] = $parsedrows[$fudgedindex] . $partialleft;

        // increment the row & initialize
        $fudgedindex += 1;
        $parsedrows[$fudgedindex] = "";
    }

    // add whatever is left to the current row
    $parsedrows[$fudgedindex] = $parsedrows[$fudgedindex] . $rowtoparse;
}

foreach($parsedrows as $rowtoprint)
{
    echo $rowtoprint . "<br>";
}

这会产生(没有突出显示):

Today I bought milk
Then I went to the store and bought even more food such as apples
I was happy
Then I went to stackoverflow.com and asked this question to solve my problem

【讨论】:

  • 此外,如果在添加partialleft 之后包含.. 的行包含..,代码只会增加fudgedindex,而不是在添加没有.. 的行之前。
  • @OIS:这是设计使然。有关更多信息,请参阅我的编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-27
  • 1970-01-01
  • 2013-02-18
相关资源
最近更新 更多