【问题标题】:PHP/Laravel - find and read 'key-value pair' from filePHP/Laravel - 从文件中查找并读取“键值对”
【发布时间】:2015-03-11 02:32:13
【问题描述】:

我想存储一些文本信息,但我不想为此使用数据库。比如有一个文件:

key1: some text information 1
key2: some text information 2
key3: another text information

我想知道,使用 PHP 或 Laravel 从这个文件中找到一个特定值的最短方法是什么?

我可以使用foreach(file('yourfile.txt') as $line) {} 循环将文本行存储到数组中,然后找到具有特定键的行,但也许有更短或更好的方法来做到这一点。

【问题讨论】:

    标签: php laravel key-value file-read


    【解决方案1】:

    我认为你应该使用数组而不是文本文件

    在 app/config 目录中创建一个新文件。我们称之为constants.php

    在那里你必须返回一个配置值数组。

    return [
        'myData' => [
            'key1' => 'www.domain.es',
            'key2' => 'www.domain.us'
            // etc
        ]
    ];
    

    您可以按如下方式访问它们

    Config::get('constants.myData');
    // or if you want a specific one
    Config::get('constants.myData.key1');
    

    你也可以设置它们

    Config::set('myData.key1', 'test 123');
    

    【讨论】:

    • Tomas 想要使用文本文件而不是数据库来获取信息,必须自己定义所有值可能不是他想要的
    • 是的,我希望能够将来自 HTML 表单输入的值信息放入该文件中。但是如果有一个选项可以通过 Config::set('myData.key1', 'test 123');那么这可能是最适合我的解决方案
    • Tomas 想要存储文本信息,后来 Tomas 提到了文件,但为了存储信息,您不一定需要文本文件。
    • 好的。我认为现在 Tomas 已经澄清了,但我仍然建议您首先创建空键值对,而不是按照我的回复中的建议(使用 set 方法)从 HTML 表单中存储(设置)值。
    • 硬编码值只是为了表明您可以使它们在 HTML 表单中的字段(作为键)上最好地动态化,并将数据作为值发布。 Config::set('myData.email', Input::get('email'));
    【解决方案2】:

    如果所有行的格式相同 ([key]: [value]),您可以简单地使用 explode(": ", $line) 获取值,然后将它们重写为 PHP 数组;

    // getData('yourfile.txt') returns an associative array
    function getData($file) {
        $data = file($file);
        $returnArray = array()
        foreach($data as $line) {
            $explode = explode(": ", $line);
            $returnArray[$explode[0]] = $explode[1];
        }
    
        return $returnArray;
    }
    

    【讨论】:

    • 小错误。应该是$returnArray[$explode[0]] = $explode[1];
    • 还有foreach($data as $line)
    • 和一个; $returnArray=array() 后丢失
    【解决方案3】:

    @leuans 答案是以下功能的基础,它对我来说效果更好,因为它还去除换行符并使分隔符可配置。

    // https://stackoverflow.com/a/27917087/1497139
    // getConfig('yourfile.txt','separator') returns an associative array
    // example: getConfig('config.ini',': ')
    function getConfig($file,$separator) {
        $data = file($file);
        $returnArray = array();
        foreach($data as $line) {
            $parts=explode($separator, $line);
            $name=trim($parts[0]);
            $value=trim($parts[1]);
            $returnArray[$name] = $value;
        }
        return $returnArray;
    }
    

    【讨论】:

      【解决方案4】:

      @leuans 的回答很好,但这种轻微的修改更好:

      • 允许在值中包含分隔符
      • 修剪空白
      • 忽略空白行
          function getData($file, $separator=":") {
              $data = file($file);
              $returnArray = array();
              foreach($data as $line) {
                  $line = trim($line);
                  $spos = mb_strpos($line, $separator);
                  if($spos !== false){
                      $key = trim(mb_substr($line, 0, $spos));
                      $value = trim(mb_substr($line, $spos+mb_strlen($separator)));
                      $returnArray[$key] = $value;
                  }
              }
          
              return $returnArray;
          }
      
      

      【讨论】:

        【解决方案5】:

        你可以使用函数parse_ini_file

        它将名称/值对的文件读取到一个数组中,以便可以轻松访问它们,例如:

        $ini = parse_ini_file("data.ini");
        $value = $ini['key1'];
        

        data.ini 可能如下所示:

        ; This is a comment
        key1=value1
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-09-15
          • 1970-01-01
          • 2017-06-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-13
          相关资源
          最近更新 更多