【问题标题】:foreach - looping through object and changing values - php5foreach - 遍历对象并更改值 - php5
【发布时间】:2010-12-10 18:00:18
【问题描述】:

我在 PHP 中有一个简单的小便清理功能

它接受一个值或值数组并进行一些输入清理。现在我使用 mysqli 将行作为对象获取,因此我需要能够将其应用于对象和数组

function filter_out($output=''){
    if($output != ''){
        // i.e passed $_POST array
        if(is_array($output)){
            $newoutput = array();
            foreach($output as $outputname=>$outputval){
                $newoutput[$outputname] = stripslashes($outputval);
                $newoutput[$outputname] = htmlspecialchars($newoutput[$outputname]); 
            }
        } else if(is_object($input)){
            ?
        }
    }
}

谁能告诉我如何用对象作为输入来做等效的事情?

【问题讨论】:

    标签: php arrays object input


    【解决方案1】:

    你要找的函数是get_object_vars:

    $vars = get_object_vars($input);
    foreach ($vars as $outputname => $outputval) {
        ///...
    }
    

    不要尝试迭代对象本身 (foreach ($object as $key => $value)),因为它不会总是正常工作。有时会(以stdClass 为例),有时不会(任何实现Traversable 的类...

    编辑

    就您的评论而言...只要课程没有做任何有趣的事情(__get__setprotectedprivate),您可以这样做:

    $newoutput = clone $input; //make a copy to return
    $vars = get_object_vars($input);
    foreach ($vars as $outputname => $outputval) {
        $newoutput->$outputname = htmlspecialchars(stripslashes($outputval));
    }
    

    但我真的想不出任何可以 100% 工作的方法...另一种选择是返回一个 nieve 对象 (stdclass) 而不是提交的对象:

    $newoutput = new StdClass();
    $vars = get_object_vars($input);
    foreach ($vars as $outputname => $outputval) {
        $newoutput->$outputname = htmlspecialchars(stripslashes($outputval));
    }
    

    【讨论】:

    • 我不确定:“有时它不会(任何实现 Traversable 的类...”,您不是说任何类实现 Traversable 吗?除非您的意思是“正确工作”意味着获取所有公共属性(而不是自定义行为)?
    • @netcoder:不,任何实现的类...都是正确的。实现Traversable 的类将改变迭代行为,并且最可能在迭代中返回对象属性。
    • @Stefan:嘿,这完全取决于您对“正确工作”的定义是什么意思。 ;-) 但我明白了。
    • 谢谢,虽然我不知道如何设置新的 val 并将其作为对象返回,但它确实可以解决问题? - 相当于我对阵列所做的事情? (我应该创建新对象,以某种方式动态创建属性名称并设置 vals )。希望这是有道理的!
    • @gio:我已经编辑过,但请仔细阅读。没有 100% 万无一失的方法可以做到这一点。如果不知道你到底想做什么,我真的无能为力...
    【解决方案2】:

    回答OP对ircmaxell's answer的评论:

    $vars = get_object_vars($input);
    foreach ($vars as $outputname => $outputval) {
        $input->$outputname = htmlspecialchars(stripslashes($outputval));
    }
    

    【讨论】:

      【解决方案3】:

      既然你提到了来自 mysqli 的数组和对象,我猜它们只是 stdClass 那么为什么不直接将对象转换为数组呢?

      $newoutput = array()
      foreach ((array) $output as $key => $value) {
        $newoutput[$key] = htmlspecialchars(stripslashes($value));
      }
      

      或者你可以就地做:

      $output = (array) $output;
      foreach ($output as &$value) {
        $value = htmlspecialchars(stripslashes($value));
      }
      

      所以单个流程可能如下所示:

      function filter_out($output=''){
        if($output != ''){
          // i.e passed $_POST array
          $is_array = is_array($output);
          $output = (array) $output;
          foreach($output as &$outputval){
            $outputval = htmlspecialchars(stripslashes($outputval)); 
          }
          if (!$is_array) {
            $output = (object) $output;
          }
        }
        return $output;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-07-27
        • 1970-01-01
        • 1970-01-01
        • 2021-10-16
        • 1970-01-01
        • 2014-08-17
        • 2012-06-21
        • 2019-07-25
        相关资源
        最近更新 更多