преобразовать массив в объект в php - PullRequest
1 голос
/ 18 октября 2011

В 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] . ", ");
    }
  }
?>

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

Ответы [ 3 ]

3 голосов
/ 18 октября 2011

используя ваш код

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) && 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

0 голосов
/ 18 октября 2011

Довольно просто - когда вы прикрепите ключ 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).*

0 голосов
/ 18 октября 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...