পিএইচপি - আমি এই অবৈধ অফসেট প্রকারের ত্রুটিটি কীভাবে ঠিক করব


90

আমি পাচ্ছি

অবৈধ অফসেট টাইপ

এই কোডটির প্রতিটি পুনরাবৃত্তির জন্য ত্রুটি। কোডটি এখানে:

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

print_r($s)

10
সতর্কতা: প্রায় সমস্ত উত্তর (জুমব্যাট বাদে) ধরে নিল যে $sourceএটি একটি উদাহরণ SimpleXMLএবং এমন তথ্য সরবরাহ করে যা কেবলমাত্র সেই নির্দিষ্ট পরিস্থিতির ক্ষেত্রে প্রযোজ্য। যদিও অবশেষে এটি ছিল, প্রশ্নটি এটি বর্ণিত হয়নি এবং যে কেউ এখানে রেফারেন্সের জন্য আসে তাকে এই বিষয়টি বিবেচনায় নেওয়া উচিত।
vlvaro González

উত্তর:


157

অবৈধ অফসেট প্রকারের ত্রুটিগুলি ঘটে যখন আপনি কোনও বস্তু বা সূচি কী হিসাবে কোনও অ্যারে ব্যবহার করে অ্যারে সূচকটি অ্যাক্সেস করার চেষ্টা করেন ।

উদাহরণ:

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

আপনার $xmlঅ্যারেতে $xml->entry[$i]->sourceকোনও মান বা অ্যারের কিছু মান রয়েছে $iএবং আপনি যখন এটির জন্য একটি সূচক কী হিসাবে ব্যবহার করার চেষ্টা করেন তখন আপনি $sসেই সতর্কতা পান। আপনি $xmlএটি যা চান তা নিশ্চিত করতে হবে এবং আপনি এটি সঠিকভাবে অ্যাক্সেস করছেন।


উত্সে এইচটিএমএল রয়েছে, সেই শ্রেণিটি কোনও বস্তু হিসাবে রয়েছে?
স্টিভেন

আপনি কি $xmlকোনও ধরণের এক্সএমএল পার্সার ব্যবহার করে ভেরিয়েবলটি তৈরি করেছেন ? সরল_ এক্সএমএল বা ডমডকুমেন্ট? সেক্ষেত্রে সম্ভবতঃ উত্স নোডটি আসলে কোনও ধরণের ডোম এলিমেন্ট অবজেক্ট।
জুমব্যাট

আমি সিম্পল এমএমএল_লোড_স্ট্রিং ব্যবহার করছি। যে সাহায্য করে?
স্টিভেন

আপনার এইচটিএমএল এক্সএমএল হিসাবে পার্স করা হতে পারে এবং সম্ভবত আপনার সমস্ত ট্যাগ নোড হয়ে গেছে। উদাহরণস্বরূপ, যদি আপনার উত্স সম্পত্তি হিসাবে আপনার "<Div> হাই </ div>" এর এইচটিএমএল স্নিপেট থাকে, তবে সম্ভবত আপনি এর মতো কিছু পেয়েছেন $xml->entry[$i]->source->div। আপনি যদি কোনও ডিওএম কাঠামোর মধ্যে এইচটিএমএল বিশ্লেষণ করতে চান তবে DomDocumentএকটি loadHTML()ফাংশন রয়েছে যা এইচটিএমএলকে সিম্পলএক্সএমএল থেকে অনেক বেশি ভাল পরিচালনা করে। পরীক্ষা করে দেখুন php.net/manual/en/domdocument.loadhtml.php
zombat

তার জন্য ধন্যবাদ. আমি এইচটিএমএল ফেলাতে str_replace ব্যবহার করেছি এবং এটি কাজ করে।
স্টিভেন

26

trim($source)আগে ব্যবহার করুন $s[$source]


4
আমি মনে করি এটি এই প্রশ্নের সঠিক উত্তর , জুম্বাটের নয়
Pmpr

4
একটি বস্তু ছাঁটাই এইমাত্র কোনো অ- সুস্পষ্ট পথ স্ট্রিং সামনে ছুঁড়ে দেওয়া আছে (সহজবোধ্য এক হতে হবে (string)$source) এবং ফলাফল সম্পূর্ণভাবে তার উপর নির্ভর করে __toString () বাস্তবায়ন। আপনার যদি কোনও SimpleXMLঅবজেক্ট থাকে (এমন কিছু যা আপাতদৃষ্টিতে প্রত্যেকে ধরে নিয়েছে তবে বাস্তবে কখনই প্রশ্নে বর্ণিত হয়নি) কাজ করে।
vlvaro González

যদি এটি ইস্যুটি __toString () প্রয়োগের সাথে কল থাকে তবে ট্রিম () পরিষ্কার সমাধান নয়। এটা বিভ্রান্তিকর.
oamo

3

চেক $ xML-> এন্ট্রি [$ i] বিদ্যমান এবং এটির সম্পত্তি পাওয়ার চেষ্টা করার আগে এটি একটি অবজেক্ট

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

বা $ উত্স আইনী অ্যারে অফসেট না হলেও একটি অ্যারে, অবজেক্ট, সংস্থান বা সম্ভবত নাল হতে পারে


4
একমাত্র সঠিক উত্তর। অ্যারেতে আপনাকে উপাদানটির অস্তিত্ব পরীক্ষা করতে হবে। এটি উপস্থিত না থাকলে আপনি এর বৈশিষ্ট্যগুলিতে অ্যাক্সেস করতে পারবেন না।
RWC

0

আপনার এক্সএমএলে সম্ভবত 20 টিরও কম এন্ট্রি রয়েছে।

এই কোড পরিবর্তন করুন

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

4
একটি অপরিজ্ঞাত পূর্ণসংখ্যার সূচকটি "অবৈধ অফসেট" সতর্কতা তৈরি করে না, আপনি তার পরিবর্তে একটি "অপরিজ্ঞাত সূচক" E_NOTICE পেয়ে যাবেন।
জুমব্যাট

0

আমারও একই সমস্যা ছিল। আমি যখন আমার এক্সএমএল সন্তানের কাছ থেকে একটি চরিত্র পেয়েছি তখন আমাকে প্রথমে একটি স্ট্রিংয়ে রূপান্তর করতে হয়েছিল (বা আপনি যদি এটির আশা করেন তবে পূর্ণসংখ্যার)। নিম্নলিখিতটি দেখায় যে আমি কীভাবে সমস্যার সমাধান করেছি।

foreach($xml->children() as $newInstr){
        $iInstrument = new Instrument($newInstr['id'],$newInstr->Naam,$newInstr->Key);
        $arrInstruments->offsetSet((String)$iInstrument->getID(), $iInstrument);
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.