foreach - цикл по объекту и изменение значений - php5 - PullRequest
3 голосов
/ 10 декабря 2010

У меня есть простая функция очистки в 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)){
            ?
        }
    }
}

Может кто-нибудь сказать мне, как я могу сделать эквивалент с объектом в качестве ввода?

Ответы [ 3 ]

3 голосов
/ 10 декабря 2010

Функция, которую вы ищете: get_object_vars:

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

Не пытайтесь выполнять итерации по самому объекту (foreach ($object as $key => $value)), потому что он не всегда будет работать правильно. Иногда это будет (stdClass в качестве примера), а иногда нет (любой класс, реализующий Traversable ...

Редактировать

Что касается вашего комментария ... Пока классы не делают ничего смешного (__get или __set, protected или private), вы можете сделать:

$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));
}
0 голосов
/ 10 декабря 2010

Поскольку вы упоминаете массивы и объекты, происходящие из mysqli, я предполагаю, что они являются просто stdClass, так почему бы просто не привести объект к массиву?

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

Или, возможно, вы могли бы просто сделать это вplace:

$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;
}
0 голосов
/ 10 декабря 2010

Чтобы ответить на комментарий ОП на ответ ircmaxell :

$vars = get_object_vars($input);
foreach ($vars as $outputname => $outputval) {
    $input->$outputname = htmlspecialchars(stripslashes($outputval));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...