【问题标题】:Array to String PHP?数组到字符串 PHP?
【发布时间】:2011-11-21 08:58:17
【问题描述】:

将 PHP 数组转换为字符串的最佳方法是什么?
我有变量$type,它是一个类型数组。

$type = $_POST[type];

我想将它作为单个字符串存储在我的数据库中,每个条目由| 分隔:

体育|节日|其他

【问题讨论】:

  • 请不要将序列化的值插入数据库。原因如下:stackoverflow.com/questions/7364803/…
  • @NullUserExceptionఠ_ఠ 我同意将序列化值插入数据库绝对会灼伤眼睛,但您不知道他的情况 - 这很可能是有道理的。
  • 我认为这个问题应该重新打开。这对初学者很有用,我不认为这是题外话。
  • 如果数组中的某些值有字符怎么办|
  • 然后您可以转义这些字符。在这里阅读。 php.net/manual/en/regexp.reference.escape.php

标签: php arrays string


【解决方案1】:

如果你有一个数组(比如 $_POST)并且需要保留键和值:

function array_to_string($array) {
   foreach ($array as $a=>$b) $c[]=$a.'='.$b;
   return implode(', ',$c);
}

结果如:"name=Paul, age=23, city=Chicago"

【讨论】:

    【解决方案2】:

    你可以使用serialize:

    $array = array('text' => 'Hello world', 'value' => 100);
    $string = serialize($array); // a:2:{s:4:"text";s:11:"Hello world";s:5:"value";i:100;}
    

    并使用unserialize 将字符串转换为数组:

    $string = 'a:2:{s:4:"text";s:11:"Hello world";s:5:"value";i:100;}';
    $array = unserialize($string); // 'text' => 'Hello world', 'value' => 100
    

    【讨论】:

      【解决方案3】:

      另一种方式,PHP var_export() 使用短数组语法(方括号)缩进 4 个空格:

      function varExport($expression, $return = true) {
          $export = var_export($expression, true);
          $export = preg_replace("/^([ ]*)(.*)/m", '$1$1$2', $export);
          $array = preg_split("/\r\n|\n|\r/", $export);
          $array = preg_replace(["/\s*array\s\($/", "/\)(,)?$/", "/\s=>\s$/"], [null, ']$1', ' => ['], $array);
          $export = join(PHP_EOL, array_filter(["["] + $array));
          
          if ((bool) $return) return $export; else echo $export;
      }
      

      拍摄here

      【讨论】:

      • 请阅读\R在正则表达式中的作用。
      【解决方案4】:

      使用implode

      implode("|",$type);
      

      【讨论】:

      • 这很好,除非您有嵌套数组 - 如果您使用数组命名的表单输入,$_POST 可能会发生这种情况。
      • 使用嵌套数组只需使用 foreach 即可。
      • @devasia2112 foreach 用于嵌套数组将不是一个好的/有效的解决方案......如果它是多级嵌套的?如果某处深度为 2 而某处深度为 3 ?在这种情况下,开销太大,程序复杂性会更糟!在这种情况下,序列化要好得多。
      【解决方案5】:

      有很多方法,

      两种最好的方法是

      $arr = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);
      echo json_encode($arr);
      //ouputs as
      {"a":1,"b":2,"c":3,"d":4,"e":5}
      
      
      $b = array ('m' => 'monkey', 'foo' => 'bar', 'x' => array ('x', 'y', 'z'));
      $results = print_r($b, true); // $results now contains output from print_r
      

      【讨论】:

      • 你在重复已经给出的答案。这不会添加新值或新方法。
      • @Tschallacka 是的,但是这篇文章中很少有答案提供输出......
      【解决方案6】:
      json_encode($data) //converts an array to JSON string
      json_decode($jsonString) //converts json string to php array
      

      为什么使用 JSON :您可以将它与大多数编程语言一起使用,由 php 的 serialize() 函数创建的字符串只能在 PHP 中读取,如果数据库是共享的,您将不喜欢将这些东西存储在您的数据库中用不同的编程语言编写的应用程序

      【讨论】:

      • JFI 在我的使用中我不得不调用 $data= json_decode($jsonString, true)
      • 第二个参数是可选的,在大多数情况下它可以在没有它的情况下工作。
      • 这非常适用于单维或多维数组,我认为这应该是公认的答案。还可以考虑添加 true 作为第二个参数。
      【解决方案7】:
      $data = array("asdcasdc","35353","asdca353sdc","sadcasdc","sadcasdc","asdcsdcsad");
      
      $string_array = json_encode($data);
      

      现在您可以将此 $string_array 值插入到数据库中

      【讨论】:

        【解决方案8】:

        对于存储关联数组,您可以使用serialize

        $arr = array(
            'a' => 1,
            'b' => 2,
            'c' => 3
        );
        
        file_put_contents('stored-array.txt', serialize($arr));
        

        并使用unserialize加载:

        $arr = unserialize(file_get_contents('stored-array.txt'));
        
        print_r($arr);
        

        但如果需要创建带有数组的动态.php 文件(例如配置文件),您可以使用var_export(..., true);,如下所示:

        保存在文件中:

        $arr = array(
            'a' => 1,
            'b' => 2,
            'c' => 3
        );
        
        $str = preg_replace('#,(\s+|)\)#', '$1)', var_export($arr, true));
        $str = '<?php' . PHP_EOL . 'return ' . $str . ';';
        
        file_put_contents('config.php', $str);
        

        获取数组值:

        $arr = include 'config.php';
        
        print_r($arr);
        

        【讨论】:

          【解决方案9】:

          不,您不想像那样将它作为单个字符串存储在数据库中。

          您可以使用serialize(),但这会使您的数据更难搜索、更难处理并浪费空间。

          你也可以做一些其他的编码,但它通常容易出现同样的问题。

          您拥有数据库的全部原因是您可以轻松完成这样的工作。你不需要一个表来存储数组,你需要一个可以表示为数组的表。

          例子:

          id | word
          1  | Sports
          2  | Festivals
          3  | Classes
          4  | Other
          

          您只需使用 SQL 从表中选择数据,而不是使用如下所示的表:

          id | word
          1  | Sports|Festivals|Classes|Other
          

          这不是任何人在关系数据库中设计模式的方式,它完全违背了它的目的。

          【讨论】:

          • 确定是的,你不必转义分隔符!
          • @MarcB 它使编码防白痴,标准,容易出错,并且可以轻松导出回数组。他应该使用另一张桌子吗?大概。这比大家说的内爆更好吗?绝对的。
          • 这个问题的正确答案是:不要在 RDBMS 中插入序列化值。这种事情应该summon raptors
          • @timdev: json-escaping 在某些情况下可能对应于 SQL 转义,但取决于这最终只会烧死你。 JSON 使用反斜杠 - 如果您使用的数据库无法识别反斜杠并使用双引号进行转义怎么办?例如'' 而不是 \'?
          • 虽然我同意这里表达的原则(正常形式很好,使用 DB 来构造很好,呵呵),任何以“不,你不”开头的 答案我不想……”在我脑海里敲响了警钟。你没有提问者问题的完整背景,不管你信不信,他们可能只是有一个 优秀 的理由来非规范化这些特定数据并将其存储在单个字段中。不,你不是无所不知的;你不知道提问者想要什么。请在评论中发表您的意见,而不是答案
          【解决方案10】:

          最好的方法之一:

          echo print_r($array, true);
          

          【讨论】:

          • 请详细说明你的答案,展示它是如何解决问题的
          • 您也可以使用:“print_r($array, false);”,因为这将打印数组而不返回值。如果给出 true, print_r() 将不会自行打印,只会返回字符串。更多信息:php.net/manual/en/function.print-r.php
          • 这个应该是最好的,因为json_decode 搞乱了格式,导致混乱。
          • 要求将字符串存储在数据库中,而不是打印出来
          【解决方案11】:

          这个可以保存 KEYS & VALUES

          function array2string($data){
              $log_a = "";
              foreach ($data as $key => $value) {
                  if(is_array($value))    $log_a .= "[".$key."] => (". array2string($value). ") \n";
                  else                    $log_a .= "[".$key."] => ".$value."\n";
              }
              return $log_a;
          }
          

          希望对某人有所帮助。

          【讨论】:

            【解决方案12】:

            您可以使用json_encode()

            <?php
            $arr = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);
            
            echo json_encode($arr);
            ?>
            

            稍后只需使用json_decode() 从您的数据库中解码字符串。 其他什么都没用,JSON 保持数组关系不变以备后用!

            【讨论】:

            • "其他的都是无用的"...除了规范化数据。
            • Rofl @ 在我上面评论。正如您所说,笼统的陈述几乎总是无益的。
            • 我很高兴你们被娱乐了:)
            • “笼统的概括,以及绝对的,总是错误的。总是。” ;)
            • 我喜欢这把钥匙。这对以后使用非常有用。
            【解决方案13】:

            implode():

            <?php
            $string = implode('|',$types);
            

            不过,Incognito 是对的,您可能不想以这种方式存储它——这完全是在浪费数据库的关系能力。

            如果您对序列化一无所知,您也可以考虑使用json_encode()

            【讨论】:

            • 内爆仅限于平面数组
            猜你喜欢
            • 1970-01-01
            • 2016-01-09
            • 1970-01-01
            • 2017-04-15
            • 2013-07-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-04-27
            相关资源
            最近更新 更多