2011-10-09 61 views
1

PHP中的数组键可以是一个嵌入零字节的字符串吗?数组键是一个嵌入零字节的字符串吗?

我想爆与嵌入式零字节作为分隔符多部分密钥,并用它作为关联数组的关键,但它似乎并不奏效。不确定这是数组访问问题还是array_keys_exists()

有没有人有什么想法?我是否以这种错误的方式去做?我应该以另一种方式创建一个多部分的关键?

为了澄清,我试图从用户输入的数据中消除重复项。数据由产品ID,变体ID和文本数据的N个字段组成。每个N字段都有一个标签和一个值。要被视为重复,所有内容必须完全匹配(产品ID,变体ID,所有标签和所有值)。

我认为,如果通过连接信息与空字节创建一个字符串键,我可以保留一个关联数组来检查是否存在重复。

+6

你能显示代码吗? – evan

+5

'print_r(array(“\ 00foo \ 00bar”=>'works'));'适用于我,是的,你应该使用另一种解决方案。如何使用多维数组呢?也许,如果你能解释你想要达到的目标,我们可以找到更好的方法来解决这个问题。 – Gordon

回答

2

the PHP string documentation

没有上的值的字符串可以由限制; (然而,一些功能,本说明书中所述 特别是与值0(“NUL字节”)字节被允许在字符串中的任何地方 不被 “二进制安全的”,也可以在串移交给无视库数据 后一个NUL字节)

the PHP arrays documentation

甲键可以是一个整数或字符串。

没有提及数组键的任何特殊情况。因此,

+0

谢谢,基于此我回去并确定我的代码有误。我最终也学习了“序列化”功能,这可能比我最初的内爆想法更好。 – Carl

+0

NUL字节在“手册”中是否有错字,或者NUL是什么意思? –

+0

@Jared:[DOS领导每个人](http://en.wikipedia.org/wiki/NUL)谈论[值为零的ASCII字节](http://en.wikipedia.org/wiki/Null_character)为“NUL”。这不是一个错字;这只是一个有点傻。 –

0

就像我已经在评论

print_r(array("\00foo\00bar" => 'works')); 

作品说。但是,没有任何理由使用implodeserialize或空字节键进行操作。

如果你想看到阵列是否相同,那么你可以对它们进行比较:

$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)); 

将数组减少到只有第一个和第三个元素。