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)
Câu trả lời:
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
$xml
Mảng của bạn chứa một đối tượng hoặc mảng $xml->entry[$i]->source
với giá trị nào đó $i
và 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 $xml
chứa những gì bạn muốn và bạn đang truy cập đúng cách.
$xml
biế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 đó.
$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, DomDocument
có 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
Sử dụng trim($source)
trước đây $s[$source]
.
(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).
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
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++)
...
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);
}
$source
là một ví dụ củaSimpleXML
và 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.