foreach - 循环访问对象和更改值 - php5

时间:2010-12-10 18:00:18

标签: php arrays object input

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

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

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)){
            ?
        }
    }
}

任何人都可以告诉我如何使用对象作为输入吗?

3 个答案:

答案 0 :(得分:3)

您正在寻找的功能是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));
}

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

既然你提到来自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;
}