2009-11-02 10 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

배열의 모든 요소에 대해 동일한 작업을 수행하려면 foreach 또는 array_map을 사용하십시오.

이 경우 대략이 라인을 따라 무엇인가? , 그 후

$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 

위처럼 파일에 다시 쓰기 :

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

(일반적으로 정규식을 위해 또한 좋은 사이트) Regex Tutorial - Lookahead and Lookbehind Zero-Width Assertions 참조 열. 이제 해결되었습니다. – Artelius

+0

또한 첫 번째 배열 요소를 잘라내는데 신경 쓰지 않는다면 $ row [0]이 원래 $ row [1]이었던 것을 참조하도록하고,'array_shift ($ row)'를 수행하면됩니다. – Artelius

+0

설명하지 않고 downvote 누가 이러한 농담하는 사람있어? – Artelius

0

해당 파일의 크기에 따라,이를 통해 루핑보다 훨씬 더 효율적이 될 수 있습니다.

열이 %%를 연속적으로 표시하도록 허용하는 경우 이스케이프 문자를 허용하도록 조정해야하지만 그 외의 경우에는 효과가 있습니다.

이 csv 파일이 실제로 커질 것으로 예상되는 경우 file_get_contents를 사용하여 파일을 메모리에서 완전히 읽지 않고 라인 단위로 반복 재생할 생각을 시작해야합니다. 나는 fgets_csv을 가리키고 싶지만 개행 문자가 아닌 다른 구분 기호로 각 csv 행을 얻을 수 있다고 생각하지 않는다. (### 구분 기호를 \ r \ n으로 바꾸지 않는 한). 이 길을가는 끝날 경우, 대답은 완전히 변경 : 정규식에 대한 자세한 내용은 P

(특히 긍정적 인 lookaheads) 죄송합니다 & $ 전에 잊어

관련 문제