PHP中的数组键是否可以是嵌入零字节的字符串?
我想破解带有嵌入式零字节作为分隔符的多部分密钥,并将其用作关联数组中的密钥,但它似乎不起作用。不确定这是数组访问问题还是使用array_keys_exists()
。
有人有任何想法吗?我是以错误的方式来做这件事的吗?我应该以另一种方式创建多部分密钥吗?
为了澄清,我试图消除用户输入数据的重复。数据由产品ID,变体ID和N个文本数据字段组成。 N个字段中的每一个都具有标签和值。要被视为重复,所有内容必须完全匹配(产品ID,变体ID,所有标签和所有值)。
我认为如果通过将信息与空字节连接来创建字符串键,我可以保留一个关联数组来检查是否存在重复项。
答案 0 :(得分:2)
来自the PHP string documentation:
字符串可以组成的值没有限制; 特别是,任何地方都允许使用值为0的字节(“NUL字节”) 在字符串中(但是,一些功能,在本手册中说不是 “二进制安全”,可以将字符串移交给忽略数据的库 在NUL字节之后。)
来自the PHP arrays documentation:
键可以是整数或字符串。
没有提及数组字符串的任何特殊情况。
所以,是。
答案 1 :(得分:0)
就像我在评论中已经说过的那样
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));
会将数组减少为仅第一个和第三个元素。