php - Làm cách nào để khắc phục lỗi loại bù trừ bất hợp pháp này


89

tôi nhận được

loại bù trừ bất hợp pháp

lỗi cho mỗi lần lặp lại mã này. Đây là mã:

$s = array();
for($i = 0; $i < 20; $i++){
    $source = $xml->entry[$i]->source;
    $s[$source] += 1;    
}

print_r($s)

10
Cảnh báo: hầu hết tất cả các câu trả lời (ngoại trừ của zombat) đều giả định rằng đó $sourcelà một ví dụ của SimpleXMLvà cung cấp thông tin chỉ áp dụng cho tình huống cụ thể đó. Trong khi đó cuối cùng là trường hợp, câu hỏi không nói rõ điều đó và bất cứ ai đến đây để tham khảo nên tính đến điều này.
Álvaro González

Câu trả lời:


157

Lỗi kiểu bù đắp bất hợp pháp xảy ra khi bạn cố gắng truy cập chỉ mục mảng bằng cách sử dụng một đối tượng hoặc một mảng làm khóa chỉ mục.

Thí dụ:

$x = new stdClass();
$arr = array();
echo $arr[$x];
//illegal offset type

$xmlMảng của bạn chứa một đối tượng hoặc mảng $xml->entry[$i]->sourcevới giá trị nào đó $ivà khi bạn cố gắng sử dụng nó làm khóa chỉ mục $s, bạn sẽ nhận được cảnh báo đó. Bạn sẽ phải đảm bảo $xmlchứa những gì bạn muốn và bạn đang truy cập đúng cách.


nguồn chứa html, lớp đó có phải là một đối tượng không?
Steven

Bạn đã tạo $xmlbiến bằng cách sử dụng một số loại trình phân tích cú pháp XML? simple_xml hay DOMDocument? Trong trường hợp đó, có khả năng nút nguồn thực sự là một loại đối tượng phần tử dom nào đó.
zombat

tôi đang sử dụng simplexml_load_string. cái đó có giúp ích không?
Steven

HTML của bạn có thể đã được phân tích cú pháp dưới dạng XML và có thể tất cả các thẻ của bạn đều trở thành nút. Ví dụ: nếu bạn có một đoạn mã HTML "<div> Xin chào </div>" làm thuộc tính nguồn của mình, thì bạn có thể có một cái gì đó giống như vậy $xml->entry[$i]->source->div. Nếu bạn muốn phân tích cú pháp HTML thành cấu trúc DOM, DomDocumentcó một loadHTML()chức năng xử lý HTML tốt hơn nhiều so với SimpleXML. Kiểm tra php.net/manual/en/domdocument.loadhtml.php
zombat

cảm ơn vì điều đó. Tôi đã sử dụng str_replace để tách html và nó hoạt động.
Steven

26

Sử dụng trim($source)trước đây $s[$source].


3
Tôi nghĩ đây là câu trả lời phù hợp cho câu hỏi này, không phải của zombat
Pmpr

5
Việc cắt xén một đối tượng chỉ là một cách không rõ ràng để truyền nó thành chuỗi (cách đơn giản sẽ là (string)$source) và kết quả phụ thuộc hoàn toàn vào việc triển khai __toString () của nó . Nó hoạt động nếu bạn có một SimpleXMLđối tượng (một cái gì đó dường như được mọi người giả định nhưng chưa bao giờ thực sự được nêu trong câu hỏi).
Álvaro González

Nếu vấn đề này có liên quan đến __toString () thực hiện thì gọi trim () không phải là giải pháp sạch. Thật là khó hiểu.
Čamo

3

kiểm tra $ xml-> entry [$ i] tồn tại và là một đối tượng trước khi cố gắng lấy thuộc tính của nó

 if(isset($xml->entry[$i]) && is_object($xml->entry[$i])){
   $source = $xml->entry[$i]->source;          
   $s[$source] += 1;
 }

hoặc $ source có thể không phải là một phần bù mảng hợp pháp mà là một mảng, đối tượng, tài nguyên hoặc có thể là rỗng


2
Câu trả lời đúng duy nhất. Bạn phải kiểm tra sự tồn tại của phần tử trong mảng. Nếu nó không tồn tại, bạn không thể truy cập các thuộc tính của nó.
RWC

0

Có thể có ít hơn 20 mục nhập trong xml của bạn.

thay đổi mã này

for ($i=0;$i< sizeof($xml->entry); $i++)
...

4
Chỉ mục số nguyên không xác định không tạo ra cảnh báo "Chênh lệch không hợp lệ", thay vào đó bạn sẽ nhận được "Chỉ mục không xác định" E_NOTICE.
zombat

0

Tôi đã có một vấn đề tương tự. Khi tôi nhận được một Ký tự từ con XML của mình, trước tiên, tôi phải chuyển đổi nó thành Chuỗi (hoặc Số nguyên, nếu bạn mong đợi). Sau đây là cách tôi giải quyết vấn đề.

foreach($xml->children() as $newInstr){
        $iInstrument = new Instrument($newInstr['id'],$newInstr->Naam,$newInstr->Key);
        $arrInstruments->offsetSet((String)$iInstrument->getID(), $iInstrument);
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.