PHP - удалить элемент из массива stdclass объектов stdclass

Заголовок может немного сбивать с толку, потому что я не совсем уверен, как описать свой «массив». Вот как это выглядит, когда я использую print_r...

stdClass Object
(
[0] => stdClass Object
    (
        [Name] => Claude Bemrose
        [Skill] => 7
        [Age] => 14
        [AgeWeeks] => 11
        [ChanceOfLeaving] => 12
    )

[1] => stdClass Object
    (
        [Name] => Willy Gearon
        [Skill] => 7
        [Age] => 12
        [AgeWeeks] => 27
        [ChanceOfLeaving] => 8
    )

[2] => stdClass Object
    (
        [Name] => Kevin Broderick
        [Skill] => 9
        [Age] => 13
        [AgeWeeks] => 21
        [ChanceOfLeaving] => 12
    )

Это похоже на объект с массивом объектов.

Я хочу удалить элемент (например, весь [1]), но если я попытаюсь использовать unset, например, unset($this->U16sArray[$arrayindex]), я получу...

Фатальная ошибка: невозможно использовать объект типа stdClass в качестве массива.

Я все еще очень смущен тем, как и почему мой «массив» выходит таким образом. Но я счастлив использовать его таким образом, пока я могу удалить элемент.

Еще немного информации по запросу. Он извлекается с использованием PDO из базы данных с ..

    try {
        $query = $db->prepare("SELECT * FROM Teams WHERE ID = :TeamID");
        $query->bindValue(':TeamID', $ID, PDO::PARAM_INT);
        $query->setFetchMode(PDO::FETCH_INTO, $this);
        $query->execute();
        $query->fetch();    
    }

Это часть гораздо большего объекта.

А затем декодируется из JSON с помощью

$this->U16sArray = json_decode($this->U16sJSON);

РЕДАКТИРОВАТЬ - Обновить.

Я медленно отслеживаю проблему. В принципе, все работает нормально, пока я не использую функцию сброса, после чего что-то изменяется, сохраняется, а затем, когда я перезагружаю его, он начинает выдавать ошибки. Предположительно, он изменился с одного типа массива на другой или что-то в этом роде.

Например, до использования функции unset для моих данных данные в моей базе данных выглядят так...

[{"Имя":"Джеймс Суитер","Навык":2,"Возраст":15,"AgeWeeks":19,"ШансОставления":8},{"Имя":"Нил Роулетт","Навык": 8, "Возраст": 15, "AgeWeeks": 11, "Вероятность ухода": 3}

Он отображается как U16sArray -> Array, когда я делаю print_r.

После того, как unset был использован где-то в данных и снова сохранен, данные теперь выглядят так.

{"0":{"Имя":"Джеймс Суйтер","Навык":2,"Возраст":15,"AgeWeeks":20,"Вероятность ухода":9},"1":{"Имя":" Нил Роулетт", "Навык": 8, "Возраст": 15, "AgeWeeks": 12, "ChanceOfLeaving": 4}

Таким образом, «0» и «1» были добавлены. Теперь мой код неверен в разных местах, и print_r теперь показывает его как объект U16sArray -> stdClass.

РЕШЕНИЕ (я думаю) - примерно 1/4 пути вниз по странице PHP: json_encode, я думаю, это ответ, на который ответил «simoncpu был здесь». По-видимому, «сброс элемента также удалит ключи». json_encode() теперь будет считать, что это объект, и будет кодировать его как таковой».

http://php.net/manual/en/function.json-encode.php

Таким образом, может показаться, что он работает нормально, unset изменяет его на объект, а затем, когда я загружаю его в следующий раз, он больше не работает как массив.

Решение состоит в том, чтобы использовать array_values ​​для переиндексации массива перед кодированием/сохранением.


person Farflame    schedule 03.11.2015    source источник
comment
ты использовал unset ?   -  person KodeFor.Me    schedule 03.11.2015
comment
Попробуйте unset($this->{'1'}); В объекте нет массивов, только числовые свойства.   -  person AbraCadaver    schedule 03.11.2015
comment
Почему вы используете stdClass для массива, а не просто используете обычный массив?   -  person Barmar    schedule 03.11.2015
comment
@Barmar Я не уверен, почему именно этот парень делает это, но это часто происходит при извлечении результатов из базы данных через ORM или фреймворк и без указания массива в качестве типа результата. Многие предполагают объекты.   -  person Mikel Bitson    schedule 03.11.2015
comment
Можете ли вы показать нам, как вы создаете этот объект?   -  person Andy Noelker    schedule 03.11.2015
comment
Я думаю, что это лучшее решение, да. Он превращает его в массив.   -  person Farflame    schedule 03.11.2015
comment
Я даже не буду делать вид, что понимаю, что происходит, но он стартует корректно как массив, даже после загрузки/кодирования/сохранения/декодирования. Я получаю [U16sArray] => Массив. Но затем, после того, как я попытаюсь использовать команду «unset», я получаю фатальную ошибку, которая, насколько я могу судить, означает, что данные не сохранены, но затем, когда я загружаю их снова, они отображаются как [U16sArray ] => Объект stdClass. Я совершенно смущен этим.   -  person Farflame    schedule 04.11.2015
comment
Пока я не использую команду unset, она остается [U16sArray] => Array, но как только я это делаю, она становится [U16sArray] => stdClass Object. Я могу сделать что-нибудь еще, не меняя его, но команда unset, за которой следует фатальная ошибка, похоже, каким-то образом меняет его.   -  person Farflame    schedule 04.11.2015


Ответы (3)


Боюсь, это одна из тех вещей, с которыми вы мало что можете сделать. Это связано с тем, что PHP был (не) разработан для обработки таких случаев. В основном вы не можете получить доступ к свойству объекта с числовым именем переменной

Этот ответ на аналогичный вопрос лучше объяснит: https://stackoverflow.com/a/10333200/1012699

Однако вы можете преобразовать объект в массив и получить доступ/удалить его содержимое. Затем бросьте обратно в объект, если хотите. См. руководство по приведению типов в php: http://php.net/manual/en/language.types.type-juggling.php

person Solomon A.    schedule 03.11.2015
comment
Спасибо, похоже, мне нужно преобразовать/удалить/переделать или исправить то, как я сформировал объект/массив в первую очередь. По крайней мере, это указывает мне направление, так что спасибо :) - person Farflame; 03.11.2015
comment
Я считаю, что вам будет намного проще декодировать json напрямую как ассоциативный массив и приводить к объекту после обработки данных $this->U16sArray = json_decode($this->U16sJSON, true); - person Solomon A.; 03.11.2015
comment
Да, это исправлено, так что теперь это массив. Так что это вроде как решает проблему, хотя сейчас у меня возникли некоторые другие проблемы... но все они решаемы :) - person Farflame; 03.11.2015

Это странный объект, не буду врать.

Любая из этих работ? (Предполагая, что ваш print_r - это print_r($this);)

unset($this->{1});
unset($this->{'1'});

Дополнительная информация: Можно ли удалить свойство объекта в PHP?

РЕДАКТИРОВАТЬ: Тем не менее, я бы рекомендовал изменить способ получения этой информации через PDO, чтобы она была в формате массива. Подробнее о том, как это сделать, здесь: PDO, возвращающий результаты выполнения в массив

Получив его в формате массива, вы можете просто использовать:

unset($data[1]);
person Mikel Bitson    schedule 03.11.2015
comment
Да, объект странный в первую очередь. Возможно, мне следует попытаться исправить это, чтобы оно было более... разумным. Я даже не уверен, как это получилось.... Решения не работают, но они не вызывают ошибки. Кажется, они вообще ничего не делают с объектом/массивом. - person Farflame; 03.11.2015
comment
Как вы получили эти данные? Извлекается ли он из базы данных с помощью PDO или какой-либо другой структуры? Я могу помочь получить это в массив, содержащий объекты. В любом случае, это сброс сработал? - person Mikel Bitson; 03.11.2015
comment
$this будет слово только внутри класса - person Mihai; 03.11.2015
comment
Я думаю, что формирование объекта является проблемой. Он создается как объекты, добавляемые в массив с помощью $object-›array[] = $newobject. Проблема может заключаться в том, что затем он проходит через базу данных с использованием PDO и JSON. Итак, он кодируется в JSON, сохраняется в базе данных, загружается и декодируется. Тогда в таком виде. Но нет, неустановленные опции не работали, хотя ошибки не выдавали. - person Farflame; 03.11.2015
comment
Можете ли вы обновить свой вопрос с помощью кода, используемого для извлечения данных из базы данных с помощью PDO? PDO имеет опции для автоматического извлечения данных в виде объектов или массивов. Переключение на массив исправит это. - person Mikel Bitson; 03.11.2015
comment
Обновил вопрос, но он немного теряется внутри более крупного объекта. По сути, это должен быть массив более мелких объектов внутри более крупного объекта. Он вытаскивается из БД с использованием приведенного выше кода. - person Farflame; 03.11.2015

Когда вы используете json_decode, вы можете передать второй параметр true

$this->U16sArray = json_decode($this->U16sJSON, правда);

результатом будет массив, с которым вы можете работать напрямую.

person Jeremy Quinton    schedule 03.11.2015