2013-05-16 7 views
17

मैं इस कोड को कॉपी करने की कोशिश कर रहा था:पीएचपी त्रुटि: (सरणी और वस्तु मुद्दों) सरणी के रूप में प्रकार stdClass की वस्तु उपयोग नहीं कर सकते

<?php 
    foreach ($blogs as $blog) { 
     $id  = $blog['id']; 
     $title = $blog['title']; 
     $content = $blog['content']; 
?> 
     <h1><?php echo $title; ?></h1> 
     <h1> <?php echo $content; ?> </h1> 

<?php 
} 
?> 

मैं:

<?php 
foreach ($products as $product) { 
    $id   = $product['id']; 
    $name  = $product['name']; 
    $description = $product['description']; 
    $price  = $product['price']; 
?> 
    <tr> 
    <td><img src="<?php echo $product['picture']; ?>" /></td> 
     <td><b><?php echo $name; ?></b><br /> 
     <?php echo $description; ?><br /> 
      Price:<big style="color:green"> 
      $<?php echo $price; ?></big><br /><br /> 
<?php 
    echo form_open('cart/add'); 
    echo form_hidden('id', $id); 
    echo form_hidden('name', $name); 
    echo form_hidden('price', $price); 
    echo form_submit('action', 'Add to Cart'); 
    echo form_close(); 
?> 
    </td> 
    </tr> 
    <tr><td colspan="2"><hr size="1" /></td> 
<?php 
} 
?> 

और यहाँ मेरे कोड है इस त्रुटि को हर बार मैं अपने कोड चलाएँ:

+1

इसके बजाय ऑब्जेक्ट सिंटैक्स आज़माएं: '$ ब्लॉग-> आईडी' – str

+0

अच्छी तरह से $ ब्लॉग एक ऑब्जेक्ट प्रतीत होता है। बस अपनी संरचनाओं की समीक्षा करने के लिए अपने $ ब्लॉग प्रिंट करें – thpl

+0

-> ऑपरेटर –

उत्तर

49

आपके द्वारा कॉपी किया गया उदाहरण एक सरणी वाले सरणी के रूप में डेटा का उपयोग कर रहा है, आप एक सरणी वाले ऑब्जेक्ट्स के रूप में डेटा का उपयोग कर रहे हैं। ऑब्जेक्ट्स और सरणी समान नहीं हैं, और इसके कारण वे डेटा तक पहुंचने के लिए विभिन्न वाक्यविन्यास का उपयोग करते हैं।

यदि आप चर नामों को नहीं जानते हैं, तो उन्हें देखने के लिए लूप के भीतर var_dump($blog); करें।

सरल विधि - सीधे एक वस्तु के रूप पहुँच $ ब्लॉग:

कोशिश (यह मानते हुए वे चर सही हैं):

<?php 
    foreach ($blogs as $blog) { 
     $id   = $blog->id; 
     $title  = $blog->title; 
     $content = $blog->content; 
?> 

<h1> <?php echo $title; ?></h1> 
<h1> <?php echo $content; ?> </h1> 

<?php } ?> 

वैकल्पिक पद्धति - एक सरणी के रूप में उपयोग कर सकते $ ब्लॉग:

वैकल्पिक रूप से, आप $blog को get_object_vars (documentation) के साथ एक सरणी में बदल सकते हैं:

<?php 
    foreach($blogs as &$blog) { 
     $blog  = get_object_vars($blog); 
     $id  = $blog['id']; 
     $title = $blog['title']; 
     $content = $blog['content']; 
?> 

<h1> <?php echo $title; ?></h1> 
<h1> <?php echo $content; ?> </h1> 

<?php } ?> 

यह उल्लेख है कि इस जरूरी नेस्टेड वस्तुओं के साथ काम करने के लिए तो इसकी व्यवहार्यता पूरी तरह से अपने $blog वस्तु की संरचना पर निर्भर करता जा रहा नहीं है लायक है।

ऊपर के दोनों की तुलना में बेहतर - इनलाइन पीएचपी सिंटेक्स

कि सभी ने कहा करने के बाद, आप सबसे अधिक पठनीय रास्ते में पीएचपी उपयोग करना चाहते हैं, ऊपर से कोई भी सही हैं।

<?php foreach($blogs as $blog): ?> 
    <h1><?php echo $blog->title; ?></h1> 
    <p><?php echo $blog->content; ?></p> 
<?php endforeach; ?> 

आशा इस मदद की: PHP एचटीएमएल के साथ intermixed का उपयोग करते समय PHP के alternative syntax उपयोग करने के लिए, इस नौ से चार पंक्तियों के लिए अपने पूरे कोड को कम करेगा कई द्वारा सबसे अच्छा अभ्यास माना जाता है।

+0

क्या यह मेरे लिए किया गया था! मैं एक खूनी बाहरी एपीआई से निपट रहा हूं जिसके परिणामस्वरूप "F_123123123" और "-105" जैसी कुंजी भी हैं। – MikingTheViking

16

$ ब्लॉग एक वस्तु नहीं एक सरणी है "सरणी के रूप में प्रकार stdClass की वस्तु का उपयोग नहीं कर सकते"

$blog->id के बजाय $blog['id']

+0

धन्यवाद, आप मेरी समस्या हल द्वारा पहुँचा है। लेकिन, मुझे यह कोड मिला जो मैं कॉपी करने की कोशिश कर रहा था। यही पर है. –

+0

http://stackoverflow.com/questions/16589313/php-error-cannot-use-object-of-type-stdclass-as-array –

2

$ ब्लॉग का उपयोग कर की कोशिश एक वस्तु, नहीं एक सरणी है, तो आप यह इतना तरह का उपयोग करना चाहिए:

$blog->id; 
$blog->title; 
$blog->content; 
3

वहाँ हो सकता है दो मुद्दों

1) $blogs may be a stdObject 

या

2) The properties of the array might be the stdObject 

var_dump ($ ब्लॉग) का उपयोग करने का प्रयास करें और वास्तविक समस्या को देखें सरणी के ई गुण इस

$blog->id; 
$blog->content; 
$blog->title; 
+0

प्रत्येक का एक त्वरित var_dump() क्रम में हो सकता है। – TML

1

तरह की कोशिश stdObject आप एक सरणी के बजाय एक वस्तु से अधिक पुनरावृत्ति कर रहे हैं है, तो आप उपयोग करने वाली प्रॉपर्टी का उपयोग करने की आवश्यकता होगी:

$id = $blog->id; 
$title = $blog->title; 
$content = $blog->content; 

यही कारण है, या परिवर्तन एक सरणी के लिए आपका ऑब्जेक्ट।

+0

मैं अपने कोड को कोड की प्रतिलिपि बनाने की तरह दिखाना चाहता हूं। मुझे ऐसा क्यों बदलना है? वह कोड नहीं है जहां से मैं कॉपी कर रहा हूं गलत है? –

2

StdClass वस्तु का उपयोग कर ->

foreach ($blogs as $blog) { 
    $id   = $blog->id; 
    $title = $blog->title; 
    $content = $blog->content; 
} 
+0

हाँ ... लेकिन मैं सोच रहा था कि मैं ऊपर दिए गए कोड को क्यों कॉपी नहीं कर सकता। इस \t foreach ($ $ ब्लॉग के रूप में ब्लॉग) {तरह \t \t \t $ आईडी \t \t = $ ब्लॉग [ 'आईडी']; \t \t \t $ शीर्षक \t \t = $ ब्लॉग ['शीर्षक']; \t \t \t $ सामग्री \t = $ ब्लॉग ['सामग्री']; ? \t> \t \t \t \t \t \t

\t \t \t

+1

@EmmanuelJosephubastero - आप कोड कॉपी नहीं कर सकते क्योंकि वे सरणी की सरणी के साथ काम कर रहे हैं, और आप ऑब्जेक्ट्स की एक सरणी के साथ काम कर रहे हैं। यह पूछने की तरह है कि आप एक प्रतिलिपि क्यों नहीं कर सकते हैं कि कोई एक साइकिल पर कार चलाता है, वे पूरी तरह अलग उपकरण हैं। मैंने अपने जवाब में बताया कि कैसे अपनी वस्तुओं को सरणी में बदलना है। –

संबंधित मुद्दे