преобразование массива в объект в php

#php #oop #variables

#php #ооп #переменные

Вопрос:

В php я преобразую размещенные данные из формы в объекты, подобные этому:

 <?php

...some code...

    $post = new stdClass;

    foreach ($_POST as $key => $val)
        $post->$key = trim(strip_tags($_POST[$key]));

?>
  

Затем на моей странице я просто повторяю опубликованные данные следующим образом :

 <?php echo $post->Name; ?>
<?php echo $post->Address; ?>
  

и т.д…

Это работает нормально, но у меня есть несколько флажков, которые являются частью группы, и я повторяю результаты этого, например:

 <?php
  $colors = $_POST['color_type'];
  if(empty($colors))
  {
    echo("No color Type Selected.");
  }
  else
  {
    $N = count($colors);

     for($i=0; $i < $N; $i  )
    {
      echo($colors[$i] . ", ");
    }
  }
?>
  

Это работает, когда я просто использую array, но как мне записать это как синтаксис объекта?

Ответ №1:

использование вашего кода

 function array_to_object($arr) {
    $post = new stdClass;
    foreach ($arr as $key => $val) {
        if(is_array($val)) {
            $post->$key = post_object($val);
        }else{
            $post->$key = trim(strip_tags($arr[$key]));
        }
    }
    return $post;
}

$post = array_to_object($_POST);
  

или более сложное решение

 function arrayToObject($array) {
    if(!is_array($array)) {
        return $array;
    }

    $object = new stdClass();
    if (is_array($array) amp;amp; count($array) > 0) {
      foreach ($array as $name=>$value) {
         $name = strtolower(trim($name));
         if (!empty($name)) {
            $object->$name = arrayToObject($value);
         }
      }
      return $object;
    }
    else {
      return FALSE;
    }
}
  

из http://www.richardcastera.com/blog/php-convert-array-to-object-with-stdclass

Ответ №2:

зачем вам это нужно? Что не так с массивом?

Используйте объектно-ориентированное программирование, которое может быть тем, что вы ищете. Обрабатывайте его как объект, вызывая класс Color и выполняя $colors[$i] = new Color();

Таким образом, вы можете делать с ним все, что захотите, и добавлять к нему функции.

Ответ №3:

Довольно просто — когда вы присоединяете color_type ключ к своему объекту, он становится массивом, который является свойством вашего объекта. Скорее всего, это то, что вы хотите: вы, вероятно, не захотите превращать этот массив в собственный stdClass объект, потому что тогда вы не сможете перебирать все значения (так же легко). Вот фрагмент:

 <?php
    // putting in both of these checks prevents you from throwing an E_WARNING
    // for a non-existent property. E_WARNINGs aren't dangerous, but it makes
    // your error messages cleaner when you don't have to wade through a bunch
    // of E_WARNINGS.
    if (!isset($post->color_type) || empty($post->color_type)) {
        echo 'No colour type selected.'; // apologies for the Canadian spelling!
    } else {
        // this loop does exactly the same thing as your loop, but it makes it a
        // bit more succinct -- you don't have to store the count of array values
        // in $N. Bit of syntax that speeds things up!
        foreach ($post->color_type as $thisColor) {
            echo $thisColor;
        }
    }
?>
  

Надеюсь, это поможет! Конечно, в реальной обстановке вам захочется выполнить все виды проверки и очистки данных — например, вы захотите проверить, действительно ли браузер передал массив значений для $_POST['color_type'] , и вы захотите очистить вывод на случай, если кто-то пытается внедрить эксплойт вваша страница (перейдя echo htmlspecialchars($thisColor); — это превращает все символы, такие как < и >, в объекты HTML, чтобы они не могли вставлять код JavaScript).

Комментарии:

1. это звучит ближе к тому, что, я думаю, я ищу. моя страница уже работала так, как я хотел, взяв все опубликованные данные и просто повторив их на странице, как описано, как <?php echo $post->Name; ?> , однако, я не знал, как получить группу флажков в том же формате объекта, что и другая размещенная информация. Но я веду подсчет, потому что пользователь может выбрать более одного варианта, а вариантов около 20. Кроме того, вывод был разделен запятой (что я и хотел), когда он отображается на странице. Я еще не попробовал ваше решение, но будет ли это работать для меня?

2. Я очень новичок в php… итак, я надеялся, что есть способ, который я мог бы понять, просто взять то, что я объяснил во второй части исходного вопроса, который работал, когда он был размещен в виде массива, и вместо этого сделать его объектами, подобными остальной информации, которая передается эхом. Что-то подобное <?php $colors = $post->color_type; if(empty($colors)) { echo("No color Type Selected."); } else { $N = count($colors); for($i=0; $i < $N; $i ) { echo($colors[$i] . ", "); } } ?> , очевидно, не работает … но я надеялся, что это было в этом направлении.

3. Ответить на вопрос, разделенный запятыми, очень просто. Просто выбросьте for цикл и замените его на echo implode(', ', $colors); — первый аргумент — это соединение (в данном случае запятая и пробел), а второй аргумент — это массив, который вы хотите «сжать» (или склеить все элементы вместе в одну строку). Есть ли какая-то особая причина, по которой вам нужно, чтобы цвета были объектом или объектами, а не просто массивом? Массивами, как правило, легче манипулировать.