2011-10-09 62 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)); 

將數組減少到只有第一個和第三個元素。