【问题标题】:How to generate an associate array from text in PHP? [duplicate]如何从 PHP 中的文本生成关联数组? [复制]
【发布时间】:2015-09-24 16:28:49
【问题描述】:

在 php 的 explode() 函数的帮助下,我一直在使用逗号 ,(或任何其他特殊字符)从纯文本创建数组

$rawPhoneNumber = "800-555-5555"; 
$phoneChunks = explode("-", $rawPhoneNumber);
echo "Raw Phone Number = $rawPhoneNumber <br />";
echo "First chunk = $phoneChunks[0]<br />";
echo "Second chunk = $phoneChunks[1]<br />";
echo "Third Chunk chunk = $phoneChunks[2]";

但是我怎样才能创建一个关联数组呢?就像我怎样才能创建一个像

这样的数组
$age = array("Peter"=>"35", "Ben"=>"37", "Joe"=>"43");

来自像“Peter=>35,Ben=>37,Joe=>43”这样的纯文本

【问题讨论】:

    标签: php arrays associative-array explode


    【解决方案1】:

    我相信还有更优雅的方法,但是……这也应该可行。

    $str='Peter=>35,Ben=>37,Joe=>43';
    $arr=explode(',',$str);
    $final=array();
    foreach ($arr as $value) {
    $val=explode('=>',$value);  
    $final[$val[0]]=$val[1];    
    
    }
    
    print_r($final);
    

    【讨论】:

    • 这就是其中之一
    • 但这将使用多个循环
    • @blasteralfredΨ,如果您担心性能,也许有更好的方法,不确定(这就是为什么我说必须有更优雅的方法,大量的 php 函数之一可能会有所帮助,不要知道)...
    【解决方案2】:

    见鬼,为什么不呢。使用array_column 和朋友的两行PHP 5.5+ 解决方案:

    $input  = 'Peter=>35,Joe=>37';
    
    $chunks = array_chunk(preg_split('/(=>|,)/', $input), 2);
    $result = array_combine(array_column($chunks, 0), array_column($chunks, 1));
    
    print_r($result);
    
    Array
    (
        [Peter] => 35
        [Joe] => 37
    )
    

    【讨论】:

      【解决方案3】:

      看看你的情况,这会起作用

      <?php
      $content = 'Peter=>35,Ben=>37,Joe=>43';
      $arr = explode(',',implode(',',explode('=>',$content)));
      $assoArray = Array();
      for($i =0; $i < sizeof($arr); $i +=2)
      {
          $assoArray[$arr[$i]] = $arr[$i +1];
      }
      print_r($assoArray);
      ?>
      

      【讨论】:

        【解决方案4】:

        你可以使用evalarray_walkforeach with an explode,甚至strtok

        $input = 'Peter=>35,Ben=>37,Joe=>43';
        $array = array ();
        
        $part = strtok($input, ',');
        while (false !== $part) {
            list ($name, $age) = explode('=>', $part);
            $array[$name] = $age;
            $part = strtok(',');
        }
        
        print_r($array);
        

        您可以通过各种复杂的方式来做到这一点。

        【讨论】:

          【解决方案5】:
              <?php
          
          $rawPhoneNumber = "800-555-5555"; 
          $phoneChunks = explode("-", $rawPhoneNumber);
          
          $myarray['Raw Phone Number'] = $rawPhoneNumber;
          $myarray['First chunk'] = $phoneChunks[0];
          $myarray['Second chunk'] = $phoneChunks[0];
          $myarray['Second chunk'] = $phoneChunks[0];
          $myarray['Third chunk'] = $phoneChunks[0];
          
          Result:
          echo "<pre>";
          print_r($myarray);
          echo "</pre>";
          
          ?>
          

          ------------- 认为这对你有用 -----

          <?php
          

          $sample = "彼得=>35,本=>37,乔=>43"; $row_chunks = explode(",", $sample);

          foreach ($row_chunks as $value) 
          {
              $row_chunks = explode("=>", $value);
              $myarray[$row_chunks[0]]=$row_chunks[1];
          }
          
          echo "<pre>";
          print_r($myarray);
          echo "</pre>";
          ?>
          

          【讨论】:

          • 我的回答有什么问题?请解释
          • 您的解决方案是手动解决方案,而不是自动解决方案。数组可能有更少或更多的条目。键名各不相同。明白了吗?
          • 很好,但你没有在问题中提到它。您能否提供您需要的示例输出?你的问题不清楚
          【解决方案6】:

          您的输入格式足够接近 PHP 原生建议 eval:

          $ages = eval('return array(' . file_get_contents('ages.txt') . ');');
          print_r($ages);
          

          例子:

          $ cat ages.txt
          Peter=>35,Ben=>37,Joe=>43
          $ php example.php
          Array
          (
              [Peter] => 35
              [Ben] => 37
              [Joe] => 43
          )
          

          但出于安全和性能原因,您最好使用string manipulation


          如果您想将数据保存在文件中,使用 PHP 数据结构,我建议您使用 var_export 并稍后写入文件 include

          $ages = array ('Peter' => 35, 'Ben' => 37 );
          file_put_contents('ages.php', '<?php return ' . var_export($ages, true) . ';');
          
          $readback = include('ages.php');
          print_r($readback);
          

          例子:

          $ php example.php
          Array
          (
              [Peter] => 35
              [Ben] => 37
          )
          $ cat ages.php
          <?php return array (
            'Peter' => 35,
            'Ben' => 37,
          );
          

          P.S.:eval 是邪恶的,但邪恶不是自动投反对票!

          【讨论】:

          • 但在执行此操作之前,请彻底清除您的输入!
          • 你说其他代码比我当前输入的文本和我们的代码性能更好?
          • @blasteralfredΨ 只是说,一般来说,evalfile_get_contents 不会非常高效。如果您想以类似 PHP 的语法将数据存储在文件中,那么您最好执行我的编辑之类的操作。
          • 无论如何,我没有使用文件,文本是从 mysql db 中检索的。所以你有什么建议?我的“php like”文本解决方案或来自链接 qn 的其他解决方案?
          • @blasteralfredΨ 你没有使用文件吗?但是你的 OP 说 35,Ben=>37,Joe=>43">>... 无论如何,如果这个字符串存储在数据库中,我建议使用适当的年龄表。如果不是这样,那么我建议进行字符串操作。我使用strtok 添加了另一个答案,这可能更符合您的喜好。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-19
          • 1970-01-01
          相关资源
          最近更新 更多