2009-03-14 21 views
6

Tôi lặp một mảng hai chiều như thế này:PHP Notice: Undefined index khi Looping mảng

if (!empty($aka)) { 
    foreach ($aka as $ak) { 
     if($ak["lang"]=="es") { 
      $sptitle=$ak["title"]; 
     } 
    } 
} 

Khá đơn giản. Nếu mảng ($ aka) không trống rỗng, tôi lặp lại máng và khi nó thấy rằng chỉ mục "lang" bằng "es" tôi chỉ lưu giá trị "title" cho chỉ mục đó trong $ sptitle.

Vấn đề là mảng ($ aka) chứa nhiều thông tin và đôi khi không có chỉ mục "lang" ... và tôi nhận được lỗi này: Thông báo: Chỉ mục không xác định: lang.

Làm cách nào để khắc phục sự cố này ???

Đây là trích xuất của mảng để giúp bạn hiểu. Lưu ý rằng [1] không có chỉ mục [lang] nhưng [2] có:

[1] => Array 
    (
     [title] => "The Lord of the Rings: The Motion Picture" 
     [year] => "" 
     [country] => "USA" 
     [comment] => "promotional title" 
    ) 

[2] => Array 
    (
     [title] => "Señor de los anillos: La comunidad del anillo, El" 
     [year] => "" 
     [country] => "Argentina" 
     [comment] => "Chile, Mexico, Peru, Spain" 
     [lang] => "es" 
    ) 

Cảm ơn!

Trả lời

15

Chỉ cần kiểm tra với isset, ví dụ:

if (!empty($aka)) { 
     foreach ($aka as $ak) { 
       if(isset($ak["lang"]) && ($ak["lang"]=="es")) { 
         $sptitle=$ak["title"]; 
       } 
     } 
} 

Nếu bạn không biết làm thế nào một nhà điều hành boolean như & & có thể ngắn mạch, nếu toán hạng đầu tiên là sai sự thật, sau đó các toán hạng thứ hai sẽ không được đánh giá. Bạn sẽ thường thấy thành ngữ này được sử dụng trong việc kiểm tra tính sẵn có của một cái gì đó trước khi hành động trên nó trong toán hạng thứ hai. Bạn cũng có thể sử dụng array_key_exists ('lang', $ aka) thay vì isset, nó có ngữ nghĩa hơi khác nhau mặc dù - nó sẽ trả về true nếu một phần tử được đặt là null, trong đó isset sẽ trả về false.

Điều thú vị là isset is at least twice as fast as array_key_exists, có thể do thực tế là nó là ngôn ngữ xây dựng thay vì gọi hàm thường xuyên.

+1

Cá nhân tôi thích array_key_exists, nhưng việc sử dụng isset đặc biệt bởi vì nó (ngạc nhiên) một LOT nhanh hơn http://us.php.net/manual/en/function.array-key-exists.php#82867 – enobrev

+0

Um, isset ($ ak ['lang']) sẽ vẫn tăng E_NOTICE của chỉ mục không xác định. array_key_exists() sẽ không. – cletus

+4

isset sẽ không tăng thông báo, hãy thử. –

0

nó sẽ là sai lầm khi sử dụng:

if (@$ak['lang']) 

tôi thực sự nhớ thực tế là chúng ta không thể vẫn làm 2 kiểm tra trong 1 như vậy

if ($ak['lang']) 

nó là một trong những đẹp những điều về PHP và tôi chỉ không thấy mục đích cảnh báo liệu một khóa mảng được khởi tạo trong một ngôn ngữ kịch bản tạm thời như PHP.

Tôi không chắc chắn nơi các nhà phát triển PHP đang thực hiện điều này. cá nhân, tôi hơi lo lắng rằng họ đang biến PHP thành một thứ khác. chỉ để nó một mình thôi. nó thật tuyệt.

+0

Trạng thái thủ công trên [trang này] (http://php.net/manual/en/errorfunc.configuration.php): "Trong PHP 4 và PHP 5, giá trị mặc định là E_ALL & ~ E_NOTICE. Cài đặt này không hiển thị Lỗi cấp E_NOTICE."Màn hình hiển thị E_NOTICE này là một vấn đề cấu hình, không phải là một vấn đề về PHP. – Unsigned

0
if (@!empty($aka)) { 
     foreach ($aka as $ak) { 
       if($ak["lang"]=="es") { 
         $sptitle=$ak["title"]; 
       } 
     } 
} 

or 


if (@$_POST['value'] == 'yes') 
{ 
    state; 
} 

trong hầu hết các trường hợp này để ý loại bỏ bằng cách sử dụng @ dấu .............

Các vấn đề liên quan