2014-12-05 52 views
2

我知道,通過將sting分配給變量,可以通過將變量用作索引數組來表示單個字符,但爲什麼下面的代碼,使用關聯數組,不僅僅是因爲需要缺少而死亡?爲什麼'isset'不會在一個肯定不存在的數組鍵上拋出FALSE?php變量,字符串和數組:關聯數組返回字符串的第一個字母

unset($a); 

$a = 'TESTSTRING'; 

if(!isset($a['anystring'])){ 
    die('MISSING REQUIRED'); 
}else{ 
    var_dump($a['anystring']); 
} 

上面的例子將輸出:

string(1) "T" 

編輯:

正如耶勒凱澤表示,這可能是比較安全的事:

if(!array_key_exists('required',$_POST)){ 
    die('MISSING REQUIRED'); 
}else{ 
    echo $_POST['required']; 
} 
+2

有趣的是,只在4.3.0 - 4.4.9和5.0.3 - 5.3.29 http://3v4l.org/vkgBC – AbraCadaver 2014-12-05 16:56:42

回答

2

什麼PHP是正在使用您的字符串作爲一個數字索引做。在這種情況下,'anystring'相當於0。您可以通過執行

<?php 
echo (int)'anystring'; 
// 0 
var_dump('anystring' == 0); 
// bool(true) 

PHP測試這個做了很多type juggling,這可能會導致「有趣」的結果。

+0

Aha。這是我正在尋找的。謝謝。 – dgig 2014-12-05 16:54:55

1

$ a是一個不是關聯數組的字符串。

如果你想以這種方式訪問​​它,你必須做這樣的事情。

$a['anystring'] = 'TESTSTRING'; 
+0

這不是我試圖訪問它。我知道如何工作。這是我猜想的更抽象的問題。我把$ a設置爲一個字符串,並且可以預料,錯誤地證明isset($ a ['anysting'])是FALSE,因爲我從來沒有設置它。但它返回true。我只是不明白這個機制。 – dgig 2014-12-05 16:53:22

0

嘗試啓用PHP使用error_reporting(E_ALL);

這應該給你一個警告,說你正在使用非法偏移,以顯示所有錯誤。因此,PHP會自動假定您正在查找數組或字母中的第一個元素。

+0

我試過了,沒有發出警告或通知。 – dgig 2014-12-05 16:54:04

+0

如果我複製並粘貼到Netbeans中,我會得到一個非法的偏移錯誤。這主要是因爲只有在使用'$ a'作爲數組時才能使用整數鍵。你是在一個完全空白的文件中寫這個嗎? – AnotherGuy 2014-12-05 16:56:44

+0

是的,它只是一個空的PHP文件。有趣的是,netbeans會做一些額外的檢查。 – dgig 2014-12-05 16:58:06

1

您需要使用array_key_exists()來測試是否有鍵存在

+0

這是一個很好的觀點。我將來會這樣做。在處理關聯數組時,它看起來像「isset」不會總是給出預期的結果。 Thx – dgig 2014-12-05 16:56:54

1

isset的工作在你的情況下是正確的。 因爲$a是一個字符串,所以index-operator會在聲明的位置給你指定的字符串。 (如「字符陣」)

一個小例子:

$a = 'TESTSTRING'; 
echo $a[0]; // Output: T 
echo $a[1]; // Output: E 
// ... 

這將輸出第一和索引0和字符串的1的第二個字符。

而且因爲索引運算符總是期望字符串的整數值。給定的值將被自動轉換爲一個整數。你可以看到這一點,當你投的字符串爲整數,如:

echo (int) 'TESTSTRING'; // Output: 0 

對於char-訪問的字符串,也see the PHP-Manual

0

它按預期的方式工作......它返回false ...但是當我強制它返回true時itz會拋出一個錯誤說非法偏移somekind ....但仍然輸出第一個字符串... 。因爲anstring鑄造爲int等於0 ..檢查您使用的兄弟的PHP版本...我用記事本++創建php文件...沒有特殊的ide ...

相關問題