2011-10-17 45 views
1

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

这个工作,当我只是使用数组,但我该如何写这个对象语法?

回答

0

你为什么要这么做?数组有什么问题?

使用面向对象的编程,这可能是你正在寻找的。把它作为一个对象,通过制作一个类叫做Color并且做$colors[$i] = new Color();

这样你就可以随心所欲地做任何事情,并为它添加功能。使用

3

代码

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

很简单 - 当您将color_type关键是你的目标,它会成为一个数组是您的对象的属性。这很可能是你想要的:你可能不想将这个数组转换成它自己的对象,因为那样你就无法遍历所有的值(就像容易)。这里有一个片段:

<?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

这听起来更接近我认为我所寻找的。我的页面已经按照我想要的方式工作,只需将所有发布的数据在页面上回显,如'<?php echo $ post-> Name; ''但是,我不知道如何获取与发布的其他信息相同对象格式的复选框组。但是,我保持计数,因为用户可以选择多个选项,并且有大约20个选项。此外,输出在页面上显示时以逗号分隔(我想要的)。我还没有尝试你的解决方案,但这仍然适合我吗? – rick

+0

我对PHP非常新颖......所以我希望有一种方法可以理解,就像我在原始问题的第二部分中所解释的那样,当它以数组形式发布时发挥作用,而让它成为对象就像正在回应的其他信息一样。就像'<?php $ colors = $ post-> color_type; if(empty($ colors)) echo(“No color Type Selected。“); } 别的 { $ N =计数($颜色); 为($ I = 0; $ I <$ N; $ I ++) { 回波($颜色[$ i]中。” ,“); } } ?>'这显然不起作用......但我希望它是沿着这些路线的 – rick

+0

要回答逗号分隔的问题,这很容易,只需扔掉'for'循环并用'echo implode(',',$ colors)替换它;' - 第一个参数是胶水(在本例中是一个逗号和一个空格),第二个参数是你想要'内爆'的数组或者将所有元素粘合成一个字符串)。是否有任何特殊原因需要颜色作为对象或对象,而不仅仅是一个数组?实际上更容易操纵。 –