Перетворити об’єкт stdClass в масив у PHP


108

Я отримую post_id від postmeta як:

$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

)

Будь-яка ідея, як я можу це зробити?


2
Можливий дублікат php stdClass до масиву
mvladk

Відповіді:


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.
користувач3442612

1
@NgSekLong: Не дуже, ні.
Амаль Муралі

60

Дуже просто: спочатку перетворіть ваш об'єкт в об’єкт json, це поверне рядок вашого об'єкта в представника JSON.

Візьміть цей результат і декодуйте додатковий параметр true, де він перетвориться на асоціативний масив

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

Проблема полягає у значеннях, які не кодуються json або не стандартизуються, тобто. дати.
Кангур

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

16

Ви можете перетворити std-об’єкт в масив таким чином:

$objectToArray = (array)$object;

1
Це чудово, але це конвертує лише перший рівень. Якщо у вас є гніздування, ви повинні зробити це для всіх вузлів.
Іван Каросаті

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 - Відновіть Моніку

Для одновимірних масивів: $ array = (масив) $ class; Для багатовимірного масиву: код зверху
Stack Overflow

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 в масив. Оберіть об'єкт на масив, використовуючи функцію масиву php.

Спробуйте з наступним фрагментом коду.

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

Це перетворить зовнішній об'єкт у масив, але якщо будь-який із властивостей також є об'єктами, вони не будуть перетворені.
Коулман

Відповідно до питання ОП, він має один рівень структури об'єкта. Для наступних рівнів вам потрібно додати ще одну петлю foreach.
NJInamdar

3

Ви можете спробувати це:

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

1

Використання ArrayObject від Std або створення власного

(новий \ ArrayObject ($ існуючийStdClass))

ви можете використовувати метод build в новому класі:

getArrayCopy ()

або передати новий об’єкт до

iterator_to_array


Якщо $existingStdClassє інше властивість, stdClassто властивість залишається stdClass у масиві, що виходить . Якщо вам потрібно щось, що працює рекурсивно, то, здається, вам потрібно використовувати методи json
Патрік

1

Припустимо, що $ post_id - це масив $ item

$post_id = array_map(function($item){

       return $item->{'post_id'};

       },$post_id);

сильний текст


1

якщо у вас є елемент масиву та елемента масиву, stdClassто це рішення:

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. як рядки .

Жоден з інших 1 лайнера не прокинувся за мною.

Це обоє спрацювало:

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

$array = json_decode(json_decode(json_encode(myOrderId($_GET['ID']))), True);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.