【问题标题】:Convert stdClass object to array in PHP在 PHP 中将 stdClass 对象转换为数组
【发布时间】:2013-10-29 23:27:35
【问题描述】:

我从 postmeta 获取 post_id 为:

$post_id = $wpdb->get_results("SELECT post_id FROM $wpdb->postmeta WHERE (meta_key = 'mfn-post-link1' AND meta_value = '". $from ."')");

当我尝试print_r($post_id); 我有这样的数组:

Array
(
    [0] => stdClass Object
        (
            [post_id] => 140
        )

    [1] => stdClass Object
        (
            [post_id] => 141
        )

    [2] => stdClass Object
        (
            [post_id] => 142
        )

)

我不知道如何遍历它,我怎么能得到这样的数组

Array
(
    [0]  => 140


    [1] => 141


    [2] => 142

)

知道我该怎么做吗?

【问题讨论】:

标签: php arrays


【解决方案1】:

最简单的方法是对您的对象进行 JSON 编码,然后将其解码回一个数组:

$array = json_decode(json_encode($object), true);

或者,如果您愿意,也可以手动遍历对象:

foreach ($object as $value) 
    $array[] = $value->post_id;

【讨论】:

  • 为什么我们不能只做$array = json_decode($object,true)
  • @akshaynagpal:这会导致错误,因为您将向期望 JSON 字符串作为其输入的函数提供对象。在答案中,我将对象转换为 JSON 字符串,然后将其作为输入提供给 json_decode() 以便它返回一个数组(第二个参数为 True 表示应该返回一个数组)。
  • 我知道为时已晚,但你为什么不使用类型转换... (array) $obj
  • @NgSekLong:不是真的,不。
  • @chhameed:如果您的对象中嵌套了其他对象,则类型转换将不起作用。查看示例 - eval.in/1124950
【解决方案2】:

很简单,先把你的对象转成json对象,这样会将你的对象的字符串返回成JSON代表。

获取该结果并使用额外参数 true 进行解码,它将转换为关联数组

$array = json_decode(json_encode($oObject),true);

【讨论】:

  • 问题在于非 json 编码或非标准化的值,即。日期。
【解决方案3】:

试试这个:

$new_array = objectToArray($yourObject);

function objectToArray($d) 
{
    if (is_object($d)) {
        // Gets the properties of the given object
        // with get_object_vars function
        $d = get_object_vars($d);
    }

    if (is_array($d)) {
        /*
        * Return array converted to object
        * Using __FUNCTION__ (Magic constant)
        * for recursive call
        */
        return array_map(__FUNCTION__, $d);
    } else {
        // Return array
        return $d;
    }
}

【讨论】:

  • 完美的函数将标准对象更改为数组
【解决方案4】:

您可以像这样将 std 对象转换为数组:

$objectToArray = (array)$object;

【讨论】:

  • 这很好,但它只转换第一级。如果您有嵌套,则必须对所有节点进行嵌套。
【解决方案5】:

有两种简单的方法可以将 stdClass 对象转换为数组

$array = get_object_vars($obj);

其他的是

$array = json_decode(json_encode($obj), true);

或者您可以简单地使用 foreach 循环创建数组

$array = array();
foreach($obj as $key){
    $array[] = $key;
}
print_r($array);

【讨论】:

  • 使用 get_object_vars 为最简单的答案投票
【解决方案6】:

对于一维数组:

$array = (array)$class; 

对于多维数组:

function stdToArray($obj){
  $reaged = (array)$obj;
  foreach($reaged as $key => &$field){
    if(is_object($field))$field = stdToArray($field);
  }
  return $reaged;
}

【讨论】:

  • 欢迎来到 SO。你介意扩大你的答案来解释它是如何解决问题的吗?
  • 对于一维数组:$array = (array)$class;对于多维数组:上面的代码
【解决方案7】:
$wpdb->get_results("SELECT ...", ARRAY_A);

ARRAY_A 是一个“输出类型”参数。它可以是四个预定义常量之一(默认为 OBJECT):

OBJECT - result will be output as a numerically indexed array of row objects.
OBJECT_K - result will be output as an associative array of row objects, using first columns values as keys (duplicates will be discarded).
ARRAY_A - result will be output as an numerically indexed array of associative arrays, using column names as keys.
ARRAY_N - result will be output as a numerically indexed array of numerically indexed arrays.  

见:http://codex.wordpress.org/Class_Reference/wpdb

【讨论】:

  • 这是 WordPress 世界中唯一建议的方式。
【解决方案8】:

在将 STD 类对象转换为数组时。使用 php 的 array 函数将对象转换为数组。

用下面的代码 sn-p 试试。

/*** cast the object ***/    
foreach($stdArray as $key => $value)
{
    $stdArray[$key] = (array) $value;
}   
/*** show the results ***/  
print_r( $stdArray );

【讨论】:

  • 这会将外部对象转换为数组,但如果任何属性也是对象,它们将不会被转换。
  • 根据 OP 的问题,他有一层对象结构。对于下一个级别,您必须添加另一个 foreach 循环。
【解决方案9】:

你可以试试这个:

$aInitialArray = array_map(function($oObject){
    $aConverted = get_object_vars($oObject);
    return $aConverted['post_id'];
}, $aInitialArray);

【讨论】:

    【解决方案10】:

    使用来自 Std 的 ArrayObject 或构建自己的

    (新 \ArrayObject($existingStdClass))

    您可以在新类上使用内置方法:

    getArrayCopy()

    或将新对象传递给

    iterator_to_array

    【讨论】:

    • 如果$existingStdClass 的属性是另一个stdClass,那么该属性在结果数组中仍然是一个stdClass。如果您需要递归工作的东西,那么您似乎需要使用 json 技术
    【解决方案11】:

    假设 $post_id 是 $item 的数组

    $post_id = array_map(function($item){
    
           return $item->{'post_id'};
    
           },$post_id);
    

    强文本

    【讨论】:

      【解决方案12】:

      如果你有一个数组并且数组元素是stdClass item 那么这就是解决方案:

      foreach($post_id as $key=>$item){
          $post_id[$key] = (array)$item;
      }
      

      现在stdClass 已被替换为数组内的数组作为新数组元素

      【讨论】:

        【解决方案13】:

        我有一个函数myOrderId($_GET['ID']);,它返回多维OBJ。作为字符串

        没有其他 1 班轮适合我。

        这两个都有效:

        $array = (array)json_decode(myOrderId($_GET['ID']), True);
        
        $array = json_decode(json_decode(json_encode(myOrderId($_GET['ID']))), True);
        

        【讨论】:

          猜你喜欢
          • 2011-11-08
          • 2016-03-29
          • 1970-01-01
          • 2017-04-22
          • 1970-01-01
          • 2020-05-29
          • 1970-01-01
          • 2018-08-09
          • 1970-01-01
          相关资源
          最近更新 更多