【问题标题】:Php for loop array not workingphp for循环数组不起作用
【发布时间】:2011-03-04 00:47:15
【问题描述】:

我会发帖,你好,世界

期待

HELLO,6
H
E
L
L
O
,
WORLD5
W
O
R
L
D

我得到了

HELLO,6
H
E
L
L
O
,

WORLD5

第二个字不会拼写?

$name = $_POST['engname'];
$convert = array_combine($letters, $jap);

function get_num_of_names($name) {
    $name = explode(" ",  $name);
        $name_mainlen = count($name);


        for($i=0; $i <= $name_mainlen + 1; $i++) {
            echo $name[$i];
            $name[$i] = str_split($name[$i]);
            $namelen = count($name[$i]);
            echo $namelen . '<br/>';

            function spellname($x, $namelen) {
                for($i=0; $i <= $namelen; $i++) {
                    echo $x[$i] . '<br/>';
                }   
            }
            spellname($name[$i], $namelen);
        }


}
get_num_of_names($name);

【问题讨论】:

  • 将此添加到脚本的底部。检查变量和数组... print_r(get_defined_vars());发布您的输出...

标签: php arrays for-loop


【解决方案1】:

您正在循环中定义一个函数。如果您要激活错误报告,您的脚本应该会出现 Function 'spellname' already defined 错误。

一个函数是在遇到它时定义的。如果将它放在一个循环中,它将在每次迭代中定义。由于您不能定义两个具有相同名称的函数,因此您的脚本会因致命错误而中止。

除此之外,还有更简单的方法来做你想做的事:

$str = 'Hello World';
$words = explode(' ', $str);
$output = array();
foreach ($words as $word) {
    $output[] = join('<br />', str_split($word));
}
echo join('<br /><br />', $output);

或者,作为单行:

echo join('<br /><br />', array_map(create_function('$a', 'return join("<br />", str_split($a));'), explode(' ', $str)));

或者,使用不同的方法甚至更短(关于@Long Ears):

echo join('<br />', str_replace(' ', '', str_split($str)));

【讨论】:

  • 抱歉,刚刚注意到我修改后的代码没有 100% 遵守“规范”,因为它在分解之前不会打印整个单词及其长度,而且它也没有使用逗号。我将把它作为练习留给 OP。 :)
  • 一个更简单但等效的单行:echo join('&lt;br /&gt;', str_replace(' ', '', str_split($str)));
  • 而且比 create_function() 稍微不那么可怕,使用条件子模式和不匹配的断言来捕获主题中不存在的字符串的正则表达式怎么样 ;)echo preg_replace('#(?(?= )(?!(&lt;br /&gt;))|).#', '$0&lt;br /&gt;$2', $str);
  • 我之所以这样做,是因为我可以将字母用作数组键并将其替换为数组值。
  • @Long create_function 并不漂亮,但它比那个正则表达式更有效并且更易于理解。 ;-) 我不得不承认您的 str_replace 方法很聪明,但您将无法获得与 OP 相同的结果。我的代码现在也没有,但它是可扩展的。
【解决方案2】:

您定义了两次相同的函数,这会导致明显的错误,因此请确保 error_reporting 为 E_ALL 并且 display_errors 在您的 php.ini 中处于打开状态。

在这种情况下,您不需要该函数,您可以循环 $name 而不是 $x

【讨论】:

  • 我终于打开了 display_errors,发现有这么多错误,但调试并看着每个错误消失还是很有趣的!谢谢。
【解决方案3】:

老兄,你的 for 循环中有一个函数!!! wtf???

如果我的一个朋友带着这个代码来找我,我会给出答复(虽然这不太可能发生)。基本上你不应该那样做。

【讨论】:

  • 我本来打算给你投反对票的,然后我读了第二段,想给你投赞成票。净 0 票(真的是因为 Deceze 的回答恰到好处),但我感谢您的回复。
【解决方案4】:

除了其他 cmets,您的函数称为 get_num_of_names,但最好称为 print_names_and_their_letters,因为获取名称的数量只是函数的一小部分。

【讨论】:

  • 感谢您刷新我对如何命名函数名称的记忆。
猜你喜欢
  • 1970-01-01
  • 2013-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-08
  • 1970-01-01
  • 2017-04-13
相关资源
最近更新 更多