将stdClass对象转换为PHP中的数组


108

我从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

)

知道我该怎么做吗?


Answers:


244

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

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

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

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

1
我们为什么不能做$array = json_decode($object,true)呢?
akshaynagpal

3
@akshaynagpal:这将导致错误,因为您将给一个对象提供一个期望以JSON字符串作为其输入的函数。在答案中,我将对象转换为JSON字符串,然后将其作为输入提供给json_decode(),这样它将返回一个数组(第二个参数为True表示应返回一个数组)。
阿马尔·穆拉利

6
我知道为时已晚,但是为什么不使用类型转换... (数组)$ obj
chhameed

json_decode(json_encode($object), True)与foreach循环相比,我发现返回的数组不同。foreach循环以OP要求的格式返回数组。
user3442612 '09

1
@NgSekLong:不是,不是。
阿马尔·穆拉利

60

很简单,首先将您的对象转换为json对象,这会将您的对象字符串返回为JSON代表。

取得结果并使用额外的参数true解码,它将转换为关联数组

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

问题在于无法json编码或未标准化的值,即。日期。
Kangur

20

试试这个:

$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;
    }
}

1
完美的功能,将stdobject更改为数组
Vivek


7

对于一维数组:

$array = (array)$class; 

对于多维数组:

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

5
欢迎来到SO。您介意扩展答案以解释它如何解决问题吗?
gung-恢复莫妮卡2014年

对于一维数组:$ array =(array)$ class; 对于多维数组:上面的代码
堆栈溢出

6
$wpdb->get_results("SELECT ...", ARRAY_A);

ARRAY_A是“ output_type”参数。它可以是四个预定义常量之一(默认为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世界中唯一建议的方法。
猛禽

6

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

试试看下面的代码片段。

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

这会将外部对象转换为数组,但是如果任何属性也是对象,则不会进行转换。
Coleman

根据OP的问题,他具有一种对象结构。对于下一个级别,您必须添加另一个foreach循环。
NJInamdar


1

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

(新\ ArrayObject($ existingStdClass))

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

getArrayCopy()

或将新对象传递给

iterator_to_array


如果$existingStdClass具有另一个属性,stdClass则该属性在结果数组中仍为stdClass。如果您需要递归有效的功能,那么您似乎需要使用json技术
Patrick Patrick

1

假设$ post_id是$ item的数组

$post_id = array_map(function($item){

       return $item->{'post_id'};

       },$post_id);

强文本


1

如果您有一个数组,并且数组元素是stdClassitem,那么这是解决方案:

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

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


1

有两种简单的方法可以将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);

0

我有一个myOrderId($_GET['ID']);返回多维OBJ 的函数。作为String

没有其他1名班轮对我起作用。

这两者都起作用:

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

$array = json_decode(json_decode(json_encode(myOrderId($_GET['ID']))), True);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.