문제

PHP에서 읽고 싶은 제품 데이터가 포함 된 .txt 파일이 있습니다. 각 라인에는 하나의 제품이 포함되어 있으며 제품 세부 사항 (번호, 이름 및 가격)은 탭으로 분리됩니다. 아래에서 볼 수 있듯이, 프록 컷 이름의 길이의 차이로 인해 가격이 수직으로 잘 정렬된다는 것은 항상 사실이 아닙니다. 데이터는 다음과 같습니다.

ABC001  an item description   $5.50
XYZ999  an other item    $6
PPP000  yet another one  $8.99
AKA010  one w a longer name   $3.33
J_B007  a very long name, to show tabs  $99

(탭을 보여주는 방법을 몰랐기 때문에 위의 예제의 공간이지만 실제 파일에서는 실제 탭입니다).

이것을하는 가장 효율적인 방법은 무엇입니까? (그건 그렇고, 원격 파일입니다) 제품 당 제품 데이터가 포함 된 배열을 갖고 싶습니다.

$product['number'], $product['name'] and $product['price']

매우 감사합니다!

도움이 되었습니까?

해결책

1) 가장 쉬운 방법은 File ()을 사용하여 모든 줄을 배열에로드하는 것입니다 (파일이 실제로 크지 않으면 다른 접근법을 고려할 것입니다).

2) 각 줄을 탭으로 분할 ( " t"문자)

3) 원하는대로 배열 열을 "형식"하십시오.

샘플 스 니펫 :

$productsArray = file($productsFileName, FILE_IGNORE_NEW_LINES);

foreach ($productsArray as $key => &$product) {
    $arr = explode("\t", $product);
    $product = array('number' => $arr[0], 'name' => $arr[1], 'price' => $arr[2]);
}

var_dump($productsArray);

다른 팁

파일을 한 줄씩 읽을 수 있습니다 (함수 사용 file, 예를 들어, 각 라인을 배열의 한 줄로 가져옵니다).

그리고 사용합니다 explode 각 선에서 필드를 분리하려면 다음과 같습니다.

$data_of_line = explode("\t", $string_line);

사용 "사용\t"(표") 분리기로서.

그러면 당신은 가질 것입니다 $data_of_line[0] 숫자를 포함하고 $data_of_line[1] 이름과 $data_of_line[2] 가격.

fgetcsv ()는 좋은 기능입니다

예제를 확인하십시오http://us3.php.net/manual/en/function.fgetcsv.php, 여기에 약간 수정 된 버전이 있습니다.

$products = array();
$handle = fopen("products.txt", "r");

while (($data = fgetcsv($handle, 1000, "\t")) !== FALSE) {
    $products[] = array(
        'number' => $data[0],
        'name' => $data[1],
        'price' => $data[2]
    );
}
fclose($handle);
$fileArr = file('path.to.your.file.txt');

$productsData = array();

for ($i = 0; $i < count($fileArr); $i++) {
    $lineData = preg_match('/^(\w{3}\d{3})\s+(.*)\s+\$(\d+(\.\d+))$/', $fileArr[$i], $matches);
    $productsData[] = array(
        'number' => $matches[1],
        'name' => $matches[2],
        'price' => $matches[3]
    );
}

사용 사용이 느려지지만 값 간의 구분 기호로 하나의 탭보다 더 많은 파일을 구문 분석 할 수도 있습니다. 게다가 당신은 벗길 필요가 없습니다 $ 가격에서 서명. 당신이 지키지 않으면 $ 대신이 REGEX를 사용해야하는 가격으로 서명하십시오.

'/^(\w{3}\d{3})\s+(.*)\s+(\$\d+(\.\d+))$/'
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top