编辑存储在数组的每个子数组中的值

时间:2009-11-02 23:52:06

标签: php

我正在使用以下代码,它可以导航到特定的数组行和子数组行并更改其值。

然而,我需要做的是将所有行的第一列更改为BLANK或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);
?>

3 个答案:

答案 0 :(得分:4)

使用foreacharray_map对阵列的所有元素执行相同的操作。

在这种情况下,大致沿着这些线?

foreach($rows as &$row) {
    $row[0] = NULL;
}

答案 1 :(得分:0)

我没有为您准备好答案,但我建议您查看CakePHP's Set class。它做得很好,并且(在某些方法中)支持XPath。希望你能找到你需要的代码。

答案 2 :(得分:0)

根据该文件的大小,这可能比循环更有效:

$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(也是一般的正则表达式网站)