数组键是一个嵌入零字节的字符串吗?
PHP中的数组键可以是一个嵌入零字节的字符串吗?数组键是一个嵌入零字节的字符串吗?
我想爆与嵌入式零字节作为分隔符多部分密钥,并用它作为关联数组的关键,但它似乎并不奏效。不确定这是数组访问问题还是array_keys_exists()
。
有没有人有什么想法?我是否以这种错误的方式去做?我应该以另一种方式创建一个多部分的关键?
为了澄清,我试图从用户输入的数据中消除重复项。数据由产品ID,变体ID和文本数据的N个字段组成。每个N字段都有一个标签和一个值。要被视为重复,所有内容必须完全匹配(产品ID,变体ID,所有标签和所有值)。
我认为,如果通过连接信息与空字节创建一个字符串键,我可以保留一个关联数组来检查是否存在重复。
从the PHP string documentation:
没有上的值的字符串可以由限制; (然而,一些功能,本说明书中所述 特别是与值0(“NUL字节”)字节被允许在字符串中的任何地方 不被 “二进制安全的”,也可以在串移交给无视库数据 后一个NUL字节)
从the PHP arrays documentation:
甲键可以是一个整数或字符串。
没有提及数组键的任何特殊情况。因此,是。
谢谢,基于此我回去并确定我的代码有误。我最终也学习了“序列化”功能,这可能比我最初的内爆想法更好。 – Carl
NUL字节在“手册”中是否有错字,或者NUL是什么意思? –
@Jared:[DOS领导每个人](http://en.wikipedia.org/wiki/NUL)谈论[值为零的ASCII字节](http://en.wikipedia.org/wiki/Null_character)为“NUL”。这不是一个错字;这只是一个有点傻。 –
就像我已经在评论
print_r(array("\00foo\00bar" => 'works'));
作品说。但是,没有任何理由使用implode
或serialize
或空字节键进行操作。
如果你想看到阵列是否相同,那么你可以对它们进行比较:
$input1 = array('product_id' => 1, 'variation_id' => 2, 'foo' => 'bar');
$input2 = array('product_id' => 1, 'variation_id' => 2, 'foo' => 'bar');
var_dump($input1 === $input2);
将输出true
而
$input3 = array('product_id' => 1, 'variation_id' => 2, 'foo' => 'foobarbaz');
var_dump($input1 === $input3);
会给false
。
引述PHP Manual on Array Operators:
$a == $b Equality TRUE if $a and $b have the same key/value pairs.
$a === $b Identity TRUE if $a and $b have the same key/value pairs in the same order and of the same types.
而且,PHP具有用于从阵列中删除重复的值的函数:
而当你的第二个参数设置为SORT_REGULAR
,PHP会比较平等,例如数组
$data = array(
array('product_id' => 1, 'variation_id' => 2, 'foo' => 'bar'),
array('product_id' => 1, 'variation_id' => 2, 'foo' => 'bar'),
array('product_id' => 2, 'variation_id' => 2, 'foo' => 'bar')
);
print_r(array_unique($data, SORT_REGULAR));
将数组减少到只有第一个和第三个元素。
你能显示代码吗? – evan
'print_r(array(“\ 00foo \ 00bar”=>'works'));'适用于我,是的,你应该使用另一种解决方案。如何使用多维数组呢?也许,如果你能解释你想要达到的目标,我们可以找到更好的方法来解决这个问题。 – Gordon