【发布时间】:2011-11-21 01:37:34
【问题描述】:
在文件中存储数组时,我使用分隔符将其内爆,但如果任何值中包含分隔符,那么这将破坏该值(并给我 2 个较小的值)。
使用不可打印字符作为分隔符是一种好习惯吗?如果是这样,该怎么做?
【问题讨论】:
-
这实际上取决于您的用例。数据是什么,您希望如何读取它,您是否预计特定上下文会使用不可打印的分隔符?
在文件中存储数组时,我使用分隔符将其内爆,但如果任何值中包含分隔符,那么这将破坏该值(并给我 2 个较小的值)。
使用不可打印字符作为分隔符是一种好习惯吗?如果是这样,该怎么做?
【问题讨论】:
这曾经是 80 年代的一种做法。特别是 ASCII 字符集有一些不可打印的符号就是为了这个目的。
034 28 1C FS (file separator) 134 92 5C \ '\\'
035 29 1D GS (group separator) 135 93 5D ]
036 30 1E RS (record separator) 136 94 5E ^
037 31 1F US (unit separator) 137 95 5F _
您可以在 PHP 中像 "\036" 一样使用它们,然后由它们拆分。但是 JSON 或 phps serialize() 格式甚至 XML 比二进制格式更适合 webapps。
【讨论】:
要将任何数据结构存储在文件中,您应该使用serialize 来存储并使用unserialize 再次恢复数据结构。
【讨论】:
为此,有许多序列化格式都有规范,说明如何处理序列化格式中具有特殊含义的字符。使用其中之一,例如JSON、serialized PHP 或CSV。
【讨论】:
我认为这不是最佳做法,但如果您出于某种原因必须这样做,那么下面的示例显示了一种使用制表符作为分隔符的方法。这张表可能对你有用http://www.asciitable.com/。
$testArray = array('item1', 'item2', 'item3');
$delimiter = chr(9);
$imploded = implode($delimiter, $testArray);
var_dump($imploded);
var_dump(explode($delimiter, $imploded));
在@mario 的回答中使用$delimiter = chr(30) 可能会更好。
【讨论】: