首页 > 解决方案 > 将数据从文本文件复制到 php 数组

问题描述

我有一个文本平面文件data.txt,其中包含这种特定格式的数据,并且始终相同:

id: 24153
firstname: john
lastname: smith
registered: true
id: 27663
firstname: ben
lastname: jackson
registered: false

如何读取文本文件并遍历所有数据点以创建一个数组,其中所有数据按以下方式排列:

Array
(
    [0] => Array
        (
            [id] => 24153
            [firstname] => john
            [lastname] => smith
            [registered] => 1
        )

    [1] => Array
        (
            [id] => 27663
            [firstname] => ben
            [lastname] => jackson
            [registered] => 
        )

)

我不完整/失败的尝试。我可以将它们全部放入一个数组中,但不确定如何按照描述的方式对其进行格式化。

$lines = file('data.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);

$arr = array();
foreach ($lines as $line_num => $line) {
    if (strpos($line, 'id') !== false) {
        $arr[$line] = //not sure how to move forward from here
    }
}

标签: php

解决方案


选项 1:如果id始终是组的第一行,您可以只使用 1 个循环来执行更简单的方法。

使用array_values会将关联数组转换为简单数组。

$fh = fopen('newfile.txt','r');
$result = array();
while ($line = fgets($fh)) {
    $line = trim($line);
    if ( $line !== '' ) {
        $line = explode(":", $line, 2);
        if ( trim( $line[0] ) === 'id' ) $id = trim( $line[1] );
        $result[$id][trim( $line[0] )] = trim( $line[1] );
    }
}
fclose($fh);

echo "<pre>";
print_r( array_values($result) );
echo "</pre>";

选项 2:您可以使用循环遍历文件的每一行。对数组进行分块。并用于array_reduce格式化数组。

$fh = fopen('newfile.txt','r');                                //Open file
$arr = array();
while ($line = fgets($fh)) {                                   //Loop thru each line
    $arr[] = trim($line);                                      //Trim the line and push in array
}
fclose($fh);

$arr = array_chunk( $arr, 4 );                                  //chunk array in the size of 4

//use array_reduce to format the array Format array
$result = array_reduce($arr, function($c,$v){
    $temp = array();
    $id = "";

    foreach($v as $val) {
        $val = explode(":", $val, 2);
        $temp[ trim( $val[0] ) ] = trim( $val[1] );
    }

    $c[$id] = $temp;
    return $c;
},array());

echo "<pre>";
print_r( $result );
echo "</pre>";

这将导致:

Array
(
    [24153] => Array
        (
            [firstname] => john
            [lastname] => smith
            [registered] => true
        )

    [27663] => Array
        (
            [firstname] => ben
            [lastname] => jackson
            [registered] => false
        )

)

推荐阅读