PHP:从array_values()返回的值中去除标签

7
我希望能够在使用array_values()函数将值用制表符连接之前,去除这些值中的标签。
我尝试了下面这行代码,但是出现了错误:
$output = implode("\t",strip_tags(array_keys($item)));

理想情况下,我希望能从值中去掉换行符、双空格和制表符。
$output = implode("\t",preg_replace(array("/\t/", "/\s{2,}/", "/\n/"), array("", " ", " "), strip_tags(array_keys($item))));

但我认为我的方法不正确!

这是整个函数:

function process_data($items){

    # set the variable
    $output = null;

    # check if the data is an items and is not empty
    if (is_array($items)  && !empty($items))
    {
        # start the row at 0
        $row = 0;

        # loop the items
        foreach($items as $item)
        {
            if (is_array($item) && !empty($item))
            {
                if ($row == 0)
                {
                    # write the column headers
                    $output = implode("\t",array_keys($item));
                    $output .= "\n";
                }

                # create a line of values for this row...
                $output .= implode("\t",array_values($item));
                $output .= "\n";

                # increment the row so we don't create headers all over again
                $row++;
            }
        }       
    }

    # return the result
    return $output;
}

请告诉我,如果您有任何想法如何解决这个问题。谢谢!

4个回答

3

strip_tags 只能作用于字符串,而不能作用于数组输入。因此,在 implode 将输入转换为字符串之后,您必须将其应用。

$output = strip_tags(
    implode("\t",
        preg_replace(
           array("/\t/", "/\s{2,}/", "/\n/"),
           array("", " ", " "),
           array_keys($item)
        )
    )
);

你需要测试一下是否得到了期望的结果。我不知道preg_replace实现了什么功能。
否则,你可以使用array_map("strip_tags", array_keys($item))先将标签移除(如果字符串中的标签确实有任何重要的\t)。
(我不知道你的大函数是关于什么的。)

非常感谢您!此函数用于导出Excel文件。但是,当值中包含标签、换行符等时,会导致“错误”。 - Run

3
尝试将数组映射到strip_tags和trim。
implode("\t", array_map("trim", array_map("strip_tags", array_keys($item))));

2
去除标签很简单,只需这样做:
$a = array('key'=>'array item<br>');

function fix(&$item, $key)
{
    $item = strip_tags($item);
}

array_walk($a, 'fix');

print_r($a);

当然,在fix函数中,您可以对$item进行任何修改。更改将存储在数组中。
对于多维数组,请使用array_walk_recursive($a, 'fix')。

在函数fix()中,$key的目的是什么?它似乎根本没有使用那个变量。谢谢。 - pal4life
array_walk 会调用回调函数并将其项和键传递给它。当您不声明 $key 时,PHP 可能会优雅地忽略它,因此您可以省略它。已经过去四年了,我不记得原因是什么,但如果我必须猜测,要么是 a) 我想展示在第二个参数中获取键名的方式(以防需要),要么是 b) 我认为这种方式更加严格和完整,我更喜欢,或者是 c) 我基于包含键名的一些代码片段,而我甚至没有注意到。 :) - GolezTrol
当然,4年是相当长的时间,所以感谢您的回复,我从未尝试过使用array_walk,所以了解它很不错。 - pal4life

1

看起来你只需要使用array_map,因为strip_tags期望的是一个字符串,而不是一个数组。

$arr = array(   "Some\tTabbed\tValue" => '1',
                "Some  value  with  double  spaces" => '2',
                "Some\nvalue\nwith\nnewlines" => '3',
            );

$search = array("#\t#", "#\s{2,}#", "#\n#");
$replace = array("", " ", " ");
$output = implode("\t", preg_replace($search, $replace, array_map('strip_tags', array_keys($arr))));
echo $output;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接