#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);
— первый аргумент — это соединение (в данном случае запятая и пробел), а второй аргумент — это массив, который вы хотите «сжать» (или склеить все элементы вместе в одну строку). Есть ли какая-то особая причина, по которой вам нужно, чтобы цвета были объектом или объектами, а не просто массивом? Массивами, как правило, легче манипулировать.