Php 是否提供标识符的可读表示?

Php 是否提供标识符的可读表示?,php,orm,domain-driven-design,identity,identifier,Php,Orm,Domain Driven Design,Identity,Identifier,作为我要求解决一个坏问题的后续行动,我试图找到一种以“可读”的方式表达任意标识符的方法 上下文:我们正在处理具有标识的实体(来自的域模型对象)。此标识(映射到数据库主键)可以表示为字符串:'123','ABC' 某些实体可以具有复合标识,即由两个或多个其他实体的标识组成:array('123','ABC') 有时,我们希望漂亮地打印此标识,或者在只允许单个字符串的位置使用它(例如,在HTML值中)。该过程必须是可预测和可逆的,即如何将其恢复到原始状态,不应存在任何歧义 当我们想要人工读取此标识时

作为我要求解决一个坏问题的后续行动,我试图找到一种以“可读”的方式表达任意标识符的方法

上下文:我们正在处理具有标识的实体(来自的域模型对象)。此标识(映射到数据库主键)可以表示为字符串:
'123'
'ABC'

某些实体可以具有复合标识,即由两个或多个其他实体的标识组成:
array('123','ABC')

有时,我们希望漂亮地打印此标识,或者在只允许单个字符串的位置使用它(例如,在HTML
值中)。该过程必须是可预测和可逆的,即如何将其恢复到原始状态,不应存在任何歧义

当我们想要人工读取此标识时,出于调试目的,更容易读取
123
ABC
123~ABC
,而不是
a:2:{i:0;s:3:123;i:1;s:3:“ABC”}
,这就是为什么我们不想使用内置函数,例如
serialize()
json\u encode>

json_encode()做得很好,但在HTML中使用它时,引号必须正确编码,它变得非常不可读:

<option value="[&quot;123&quot;,&quot;ABC&quot;]">

我们可以使用一种很好的格式,就像这样:

<option value="123~ABC">

在发布HTML表单时,我们必须能够将此编码标识还原为其原始状态:
array('123','ABC')
以检索正确的实体

最后,如果身份包含除字母和数字以外的其他字符,则格式变得复杂(人类)读取是完全可以接受的

一些基本例子:

'123'
=>
'123'

'ABC'
=>
'ABC'

array('123','ABC')
=>
'123~ABC'
(只是一个想法)

'带有非字母数字、甚至非字符$的字符串
=>

对于包含其他字符的字符串,任何(或多或少复杂的)表示都是可以接受的。结果字符串应仅包含ASCII字符,即使原始字符串包含非ASCII字符。整个过程必须是完全可逆的

你知道怎么做吗

str_replace( array('[',']','&quot;',',') ,
             array('','','','~'),
            json_encode($stuff)
);

您的问题非常冗长,无法解释您真正想要实现的目标。

根据您在评论中给出的反馈,我建议您使用或对标识符原子进行编码

然后可以使用
冒号创建原子合成

class Identifier {
    static function encode(array $identifier) {
        return implode(', ', array_map('rawurlencode', $identifier));
    }
    static function decode($identifier) {
        return array_map('rawurldecode', 
            array_map('trim', explode(',', $identifier))
        );
    }
}

$identifier = array('111', 'abc');
var_dump($identifier);

$encoded = Identifier::encode($identifier);
var_dump($encoded);

$decoded = Identifier::decode($encoded);
var_dump($decoded);

您可以使用2个特殊字符:

~
-分隔符

*
-转义字符(转义分隔符或转义字符本身)

示例:

array('123','ABC') => 123~ABC
array('12*3','A~BC') => 12**3~A*~BC

您可以为分隔符和转义符选择不同的字符。如果所选字符很少可用,则字符串通常可读性良好。

实体的有效字符是什么?任何字符对标识都是有效的,就像在数据库字符串主键中一样。但在现实生活中,它大部分时间是由可读字符组成的。这就是为什么编码应该同时容纳这两个字符。那么你在谈论哪个字符集呢?它可以用Unicode代码点表示吗?很好。字符集应该无关紧要。如果原始字符串包含非ASCII字符,那么对其进行编码以使其也适合ASCII字符集也是一个很好的解决方案。我更新了我的问题以反映这一点。lol,与中的注释正好相反,这解释了详细性。我想它确实很好地解释了我想要实现的目标,我只是在问题中添加了另一句话,也许不是那么明显:“当发布HTML表单时,当必须能够将其还原到原始状态以检索正确的实体时”。关于你的代码,你没有解释你是如何将其反转的?@Benjamin:编辑你的问题(删除所有内容)并发布一系列示例以及你想要如何转换它。我也会根据你的建议编辑我的答案。谢谢你的建议,我会添加一些例子,但不会删除这个问题。上一个问题的人确实想了解问题的背景。这是一个非常有趣和简单的方法,它确实解决了上面所表达的问题,谢谢!感谢您编写了这段优秀的代码,它非常罕见,足以突出显示它。我只需删除逗号后的空格(在我看来不太有用),这似乎完美地解决了我的问题:
返回内爆(',',array_map('rawurlencode',$identifier))
返回数组_映射('rawurldecode',explode(',',$identifier))。考虑其他人可能在文件中编辑这些标识符,并可能添加空白。因此,修剪。输出严格,但接受输入不严格。我看不出用户必须编辑标识符的用例,但为什么不,我理解你的观点。这两种方法都是有效的,尽管我可能倾向于最简单的一种,对于人类可读性需求(人类可写性目前还不是一个问题)。非常感谢你的帮助,这是一份出色的工作!类用作命名空间?这是一个否定:)