需要丢弃具有空值的数组

时间:2012-12-26 17:48:20

标签: php arrays

鉴于,在输入表单中,用户可以用新行分隔某些特定名称,我将这些名称保存在数组中。然后我打印这些名字,最后说出“谢谢你的名字”。

         $var = "name1 



name2


        ";
    $your_array = explode("\n", $var);


        for($i=0; $i<(sizeof($your_array));$i++) {
          echo ($your_array[$i]);  
        }
echo "Thank you for the names"

但问题是如果有人在名字之前或之后输入多个换行符,那么下一个名字会在下面的某个距离之后显示

    name1



    name2


Thank you for the names

如何逃避这个并输出如下

name1
name2
Thank you for the names

我尝试使用array_filter()但它在这里不起作用。

更新

If someone input
$var = "name1\nname2\n\n\n


           name3                     


name4";

输出应该像

name1
name2
               name3
name4

但所有答案都显示为

name1
name2
name3
name4

5 个答案:

答案 0 :(得分:2)

为了简单起见,让我们使用foreach循环...

1)我们需要遍历新数组和trim名称,以便我们丢失所有空格。

2)当且仅当名称的长度为1或更长时,我们才会回显该名称。

3)我们添加<br>标记,以使每个名称显示在新行上。

<?php

$var = "name1\nname2\n\n\n";

$your_array = explode("\n", $var);

foreach($your_array as $name)
{
    if(preg_match("/[a-zA-Z0-9]{1,}/i", $name)) {
        $name = trim($name);
        echo (strlen($name) > 1) ? sprintf('%s<br>', $name) : '';
    }
}

echo "Thank you for the names";
?>

答案 1 :(得分:1)

$your_array = explode(PHP_EOL, $var);

$names = array();

for ($i = 0; $i < count($your_array); $i ++ )
{
    // trim clean spaces and newlines surrounding each line
    // resulting value is assigned to $test
    // if this value is not empty the conditional is a true proposition
    // so is assigned to $names
    if ($test    = trim($your_array[$i]))
        $names[] = $test;
}

echo implode(PHP_EOL, $names) . PHP_EOL;
echo 'Thank you for the names.';

编辑:使用foreach

$your_array = explode(PHP_EOL, $var);

foreach ($your_array as $name)
{
    if ($test    = trim($name))
        $names[] = $test;
}

if ($names)
{
    // echo implode(PHP_EOL, $names) . PHP_EOL;
    echo implode('<br />', $names) . '<br />';
    echo 'Thank you for the names.';
}
else
    echo 'Names missing.';

编辑2

trim接受明确删除的列表,因此如果您想维护空格,请仅列出newlinescarriage return的列表。

trim($name, "\r\n");

注意:PHP_EOL是正确的新行char,取决于服务器(unix或windows)。

答案 2 :(得分:1)

Be a better PHP developer并使用本机PHP数组函数:

$raw_arr = array('    trim  ', 'fine', '    ');

array_walk($raw_arr, function(&$value) {
  $value = trim($value);
});

$reduced_arr = array_filter($raw_arr);

print_r($reduced_arr);

注意:我使用过闭包。如果您正在运行PHP&lt; 5.3,您需要将其移动到UDF。

更新

好像你不想修剪用户输入。因此,您可以删除array_walk及其关闭。

$raw_arr = array('    trim  ', 'fine', '');
$reduced_arr = array_filter($raw_arr);

print_r($reduced_arr);

答案 3 :(得分:0)

for($i=0; $i<(sizeof($your_array));$i++) {
    if (empty($your_array[$i])) continue;
          echo ($your_array[$i]);  
        }
echo "Thank you for the names"

答案 4 :(得分:0)

您可以使用array_filter + array_map + trim来弃空空

$var = "name1 



name2


        ";

$array = array_filter(array_map("trim",explode("\n", $var)));
echo implode(PHP_EOL, $array) , PHP_EOL;
echo "Thank you for the names";

或者只使用preg_match_all

preg_match_all("/\S?([a-z0-9]+)\S?/", $var,$array);
echo implode(PHP_EOL, $array[0]),PHP_EOL;
echo "Thank you for the names";

两者都会输出

name1
name2
Thank you for the names