Преобразование объекта 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, указывает, что массив должен быть возвращен).
Amal Murali
6
Я знаю, что уже слишком поздно, но почему вы не используете приведение типов ... (array) $ obj
chhameed
Я обнаружил, что json_decode(json_encode($object), True)возвращенный массив отличается от цикла foreach. Цикл foreach возвращает массив в запрошенном OP формате.
user3442612
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 на array
Вивек
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 - Reinstate Monica
Для одномерных массивов: $ array = (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.
Raptor
6

При преобразовании объекта класса STD в массив. Преобразуйте объект в массив с помощью функции массива php.

Попробуйте воспользоваться следующим фрагментом кода.

/*** cast the object ***/    
foreach($stdArray as $key => $value)
{
    $stdArray[$key] = (array) $value;
}   
/*** show the results ***/  
print_r( $stdArray );
NJInamdar
источник
Это преобразует внешний объект в массив, но если какие-либо свойства также являются объектами, они не будут преобразованы.
Coleman
Согласно вопросу OP у него один уровень объектной структуры. Для следующих уровней вам нужно добавить еще один цикл foreach.
NJInamdar
3

Вы можете попробовать это:

$aInitialArray = array_map(function($oObject){
    $aConverted = get_object_vars($oObject);
    return $aConverted['post_id'];
}, $aInitialArray);
Саджуна Фернандо
источник
1

Использование ArrayObject из Std или создание собственного

(новый \ ArrayObject ($ existingStdClass))

вы можете использовать метод build в новом классе:

getArrayCopy ()

или передайте новый объект в

iterator_to_array

Decebal
источник
Если $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был заменен массивом внутри массива как новый элемент массива

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

Ни один из других лайнеров меня не устроил.

Это сработало:

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

$array = json_decode(json_decode(json_encode(myOrderId($_GET['ID']))), True);
Киборг
источник