数组键是否可以是嵌入零字节的字符串?

时间:2011-10-09 15:27:23

标签: php arrays

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

我想破解带有嵌入式零字节作为分隔符的多部分密钥,并将其用作关联数组中的密钥,但它似乎不起作用。不确定这是数组访问问题还是使用array_keys_exists()

有人有任何想法吗?我是以错误的方式来做这件事的吗?我应该以另一种方式创建多部分密钥吗?

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

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

2 个答案:

答案 0 :(得分:2)

来自the PHP string documentation

  

字符串可以组成的值没有限制;   特别是,任何地方都允许使用值为0的字节(“NUL字节”)   在字符串中(但是,一些功能,在本手册中说不是   “二进制安全”,可以将字符串移交给忽略数据的库   在NUL字节之后。)

来自the PHP arrays documentation

  

键可以是整数或字符串。

没有提及数组字符串的任何特殊情况。

所以,

答案 1 :(得分: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));

会将数组减少为仅第一个和第三个元素。