【问题标题】:php get array values from stdClass objectphp 从 stdClass 对象获取数组值
【发布时间】:2014-04-29 05:47:11
【问题描述】:

这是我从页面收集数据的函数。数据存储到数组中,最后我使用 var_dump() 回显它。

数据被打包成长度为 40 的数组。我试图单独获取每个数组值。

当我使用var_dump($root) 转储时,数组结果如下所示:

object(stdClass)[1]
  public 'items' => 
    array (size=40)
      0 => 
        object(stdClass)[12983]
          public 'comment' => string 'Locanda is great ! Maybe a bit overrated... But I definitely enjoyed my first dinner here! <br><br>Trippa alla romana is so good! My first time eating tripe and the texture wasn&#39;t bad at all plus the sauce was fantastic! <br><br>The leg of lamb was nice, a bit too rare for me but I didn&#39;t specify how I wanted it so next time I will. <br><br>The hen wrapped in pancetta was so delicious and juicy! Would recommend that over the lamb. <br><br>We also had a nice pasta dish.. Orecchiette which was of cour'... (length=738)
          public 'rating' => string '4.0' (length=3)
          public 'date' => string '2014-04-03' (length=10)
      1 => 
        object(stdClass)[12984]
          public 'comment' => string 'Made reservations last friday night here for a fun special dinner, had a pretty good time but was a bit underwhelmed.<br><br>We arrived early for our reservation, about 15 minutes and were going to go to the bar for a cocktail but the hostess told us that she could sit us early and to not to go to the bar and then we were sat 10 minutes after our reservation time. A bit annoying but I get it, it&#39;s Friday night. We got a great table in the back half or the restaurant so we weren&#39;t by the door and awk'... (length=1676)
          public 'rating' => string '3.0' (length=3)
          public 'date' => string '2014-04-21' (length=10)
      2 => 
        object(stdClass)[12985]
          public 'comment' => string 'Thinking to have something special for dinner on Sunday, we ordered takeout from Locanda through Postmates. Â Words cannot describe how sad we were when the food came. Â The portions are TINY TINY TINY and slopped into large paper takeout containers (no, not even the wax lined ones) that make them look even smaller. Â Miniscule, beyond small portions. Â The sauce soaked into the containers, so icky. Â Food has never looked so pitiful.<br><br>We paid $70 for three dishes that would all fit on a single plate '... (length=2081)
          public 'rating' => string '2.0' (length=3)
          public 'date' => string '2014-03-31' (length=10)
      3 => 
        object(stdClass)[12986]
          public 'comment' => string 'I can&#39;t say enough good things about locanda. Finally reviewing after eating dinner there as opposed to just visiting the bar. <br><br>Dinner was fantastic - warm bread and brussel sprouts to start. Pasta with broccoli rabe and sausage was so wonderful (and so hard to find in sf!)<br><br>Now for the bar. Bartenders are so knowledgeable and friendly. Â I love how they&#39;ll listen to your feedback and then get creative on your next drink. Most recently tried the steam shandy - excellent! Â Oh, and old f'... (length=530)
          public 'rating' => string '5.0' (length=3)
          public 'date' => string '2014-03-30' (length=10)
      4 => 
        object(stdClass)[12987]
          public 'comment' => string 'The wait for 2 on a Saturday night at 6:15pm was only 20 minutes. Cocktails were delicious, though the ginger cocktail was too gingery. We got the whole grilled fish. It was pretty good but a bit too salty. The atmosphere is great.' (length=231)
          public 'rating' => string '4.0' (length=3)
          public 'date' => string '2014-04-20' (length=10)

等等

给出这个结果的代码。

  function Getdata($url){
    print("$url\n");
    $root = new stdClass();
    $items = array();
    $html = file_get_html($url);
    if($html){
      $containers = $html->find('div.review-list div.review div.review-wrapper');
      foreach($containers as $container){
        $comments = $container->find('div.review-content p.review_comment');
        $item = new stdClass();
        foreach($comments as $comment){
          $comment_html = $comment->innertext();
          $item->comment = $comment_html;
        }
        $metas = $container->find('div.review-content meta');
        foreach($metas as $meta){
          $itemprop = $meta->itemprop;
          $content = $meta->content;
          if($itemprop == 'ratingValue') $key = 'rating';
          else $key = 'date';
          $item->$key = $content;
        }
        $items[] = $item;
      }
    }
    $root->items = $items;
    if($html){
      $html->clear();
      unset($html);
    }
    var_dump $root;

  }

这里我尝试分别获取comment、rating、date 中的每一个

  for($i = 0 ; $i <=80 ; $i = $i + 40)
    {
          $url = 'http://www.testioco.com/biz?start='.$i.'';
          $root = yelp($url);
            for($j = 0; $j < sizeof($root); $j++)
                {
                    echo $root[$j]['comment']."<br/>";                  
                    echo $root[$j]['rating']."<br/>";               
                    echo $root[$j]['date']."<br/>";             
                }
          //var_dump($root);
          flush();
          ob_flush();
    }

我想将每个评论、评分、日期分开存储在数据库中。所以请相应地帮助我。

【问题讨论】:

    标签: php arrays


    【解决方案1】:

    $root-&gt;items 是你要迭代的数组:

    $root = yelp($url);
    foreach($root->items as $item) {
        echo $item->comment."<br/>";                  
        echo $item->rating."<br/>";               
        echo $item->date."<br/>";             
    }
    

    【讨论】:

    • 我认为应该是 $item->comment, $item->rating, $item->date 而不是 $item['comment'], $item['rating'], $item ['日期']
    • @xdazz 和 Leo,谢谢。 $root 是一种数组,对吗?我混淆了为什么数组有这么多不同的格式。是因为stdClass吗?
    【解决方案2】:
    $comment = array_map(create_function('$o', 'return isset($o->comment)? $o->comment: "" ;'), $item);     
    

    此代码将返回单个数组中的所有注释。

    【讨论】:

      猜你喜欢
      • 2017-10-06
      • 1970-01-01
      • 1970-01-01
      • 2021-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多