2009-11-02 60 views
1

我正在使用下面的代碼,它可以讓我導航到特定的數組行,以及子數組行並更改其值。編輯存儲在數組的每個子陣列中的值

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

回答

0

我沒有給你一個現成的答案,但我會建議您檢查出CakePHP's Set class。它很好地完成了這些事情,並且(在某些方法中)支持XPath。希望你能找到你需要的代碼。

4

使用foreacharray_map對數組的所有元素執行相同的操作。

在這種情況下,大致沿着這些線?

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

對不起,忘$前&行。現在修復。 – Artelius 2009-11-03 00:03:29

+0

此外,如果您不介意完全切斷第一個數組元素,以便$ row [0]引用最初的$ row [1],那麼只需執行'array_shift($ row)'。 – Artelius 2009-11-03 00:04:42

+0

這些沒有解釋就冷靜下來的笑話的人怎麼了? – Artelius 2009-11-05 08:25:12

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(也是一個很大的網站,一般的正則表達式)

相關問題