我使用以下代码导航到特定的数组行和子数组行并更改其值。
但是,我需要做的是将所有行的第一列更改为空白或NULL,或者将它们清除。
如何更改下面的代码来完成此操作?
<?php
$row = $_GET['row'];
$nfv = $_GET['value'];
$col = $_GET['col'];
$data = file_get_contents("temp.php");
$csvpre = explode("###", $data);
$i = 0;
$j = 0;
if (isset($csvpre[$row]))
{
$target_row = $csvpre[$row];
$info = explode("%%", $target_row);
if (isset($info[$col]))
{
$info[$col] = $nfv;
}
$csvpre[$row] = implode("%%", $info);
}
$save = implode("###", $csvpre);
$fh = fopen("temp.php", 'w') or die("can't open file");
fwrite($fh, $save);
fclose($fh);
?>发布于 2009-11-03 07:58:33
使用foreach或array_map对数组的所有元素执行相同的操作。
在这种情况下,大致是这样的吗?
foreach($rows as &$row) {
$row[0] = NULL;
}发布于 2009-11-03 07:56:51
我没有现成的答案给你,但我建议你去看看CakePHP's Set class。它做这样的事情做得很好,并且(在某些方法中)支持XPath。希望你能在那里找到你需要的代码。
发布于 2009-11-03 15:37:40
根据该文件的大小,这可能比循环遍历要高效得多:
$data = file_get_contents("temp.php"); //data = blah%%blah%%blah%%blah%%###blah%%blah%%blah
$data = preg_replace( "/^(.+?)(?=%%)/", "\\1", $data ); //Replace first column to blank
$data = preg_replace( "/(###)(.+?)(?=%%))/", "\\1", $data ); //Replace all other columns to blank之后,将其写回到文件中,就像上面所做的。
如果您的列允许%%连续出现在转义字符中,则需要对其进行调整以允许转义字符,但除此之外,这应该是可行的。
如果您希望这个csv文件变得非常大,那么您应该开始考虑逐行遍历文件,而不是使用file_get_contents将其完全读取到内存中。我建议您使用fgets_csv,但我不认为可以使用换行符以外的任何分隔符来获取每个csv行(除非您愿意将###分隔符替换为\r\n)。如果你最终选择了这种方式,答案就完全不同了:P
有关正则表达式的更多信息(特别是正则表达式),请参阅Regex Tutorial - Lookahead and Lookbehind Zero-Width Assertions (这也是一个很棒的正则表达式站点)
https://stackoverflow.com/questions/1664447
复制相似问题