#php #arrays #object #soap #stdclass
#php #массивы #объект #soap #стандартный класс
Вопрос:
Я получил этот смехотворно сложный массив объектов в качестве ответа SOAP. Мне нужно распечатать «string_operator_collection» с помощью цикла. Это набор операторов, похожих на [«equal_wild»], но со всеми разными именами. Вложенность настолько глубока, что я не могу получить доступ с помощью обычных методов. Какие-нибудь идеи, пожалуйста?
object(stdClass)#2 (1) {
["get_search_frame_details_response"]
=> object(stdClass)#3 (2) {
["response_context"]=> object(stdClass)#4 (3) {
["session_token"]
=> string(28) "b0ac045931183d1ead6b9f6da061"
["response_status"]=> string(2) "OK"
["response_message"]=> string(0) "" }
["search_frame_details_response_data"]
=> object(stdClass)#5 (2) {
["search_field_collection"]=> object(stdClass)#6 (1) {
["search_field"]=> array(4) {
[0]=> object(stdClass)#7 (3) {
["field_id"]
=> string(82)
"OsCashAllocationCashAllocationPk"
["field_name"]=> string(15) "Customer Number"
["field_operator"]
=> object(stdClass)#8 (1) {
["string_operator_collection"]
=> object(stdClass)#9 (16) {
["equal_wild"]=> string(2) "=*"
Мои лучшие усилия на данный момент:
get_search_frame_details_response->
search_frame_details_response_data->
search_field_collection->search_field;
print_r(array_values($search_frame_op1));
Комментарии:
1. Конечно, вы можете использовать
normal methods
!!!! Вам просто нужно потратить некоторое время на его разработку2. Я лично считаю
print_r()
, что вывод легче отслеживать, попробуйте это, опубликуйте его, если вы все еще не можете с этим справиться3. Отступ, с которым он размещен здесь, является диким. Это очень затрудняет визуальный анализ. Если вы загружаете это в браузер с
var_dump()
помощью, просмотрите исходный код страницы и скопируйте его точно так, как он там отображается.print_r()
будет немного менее шумным и более удобным для чтения.4. Извините, мне пришлось отформатировать его, чтобы соответствовать правилам переполнения стека. @RiggsFolly Я пробовал print_r, и это понятнее. Я уже несколько часов перепробовал так много разных комбинаций.
5. Как я уже сказал, с этим отступом действительно сложно определить, но, похоже
$var->get_search_frame_details_response->search_frame_details_response_data->search_field_collection->search_field[0]->field_operator->string_operator_collection->equal_wild
, наращивайте его постепенно иprint_r()
на каждом шаге, чтобы убедиться, что вы правильно сужаете его.
Ответ №1:
Я думаю (отображение не помогает) string_operator_collection
, адрес
$obj
->get_search_frame_details_response
->search_frame_details_response_data
->search_field_collection
->search_field[]
->field_operator
->string_operator_collection
->equal_wild
Так как массив начинается с
$obj
->get_search_frame_details_response
->search_frame_details_response_data
->search_field_collection
->search_field[];
мы можем написать цикл, подобный этому
$the_array = $obj
->get_search_frame_details_response
->search_frame_details_response_data
->search_field_collection
->search_field;
foreach($the_array as $field ) {
echo $field
->field_operator
->string_operator_collection
->equal_wild;
}
Комментарии:
1. В будущем я постараюсь форматировать так же хорошо, как и вы. Ваш ответ блестящий. Вы проводите какие-либо консультации? Лучший ответ.
2. @RobertMorel Если вы спрашиваете, могу ли я работать на временной основе, ответ — ДА
3. Потрясающе, я буду ждать от вас ответа.
Ответ №2:
Использование цикла:
function findInCollection($collection, $fieldToFind){
foreach($collection as $key => $subCollection) {
if ($key == $fieldToFind) {
return $subCollection;
}
if ( ! is_object($subCollection)) {
return null;
}
return findInCollection($subCollection, $fieldToFind);
}
}
Но помните, что у вас могут возникнуть действительно серьезные проблемы, если ключевая доза не существует.
Комментарии:
1. Спасибо, но в данном конкретном случае это работает не слишком хорошо.