سؤال

أعلم أنني أستطيع حلقة من خلال كل مستوى من مستوى الكائن، لكنني أود اتباع نهج أكثر بسيطة لهذا.

QueryResult Object
(
    [queryLocator] => 
    [done] => 1
    [records] => Array
        (
            [0] => SObject Object
                (
                    [type] => type_1
                    [fields] => 
                    [sobjects] => Array
                        (
                            [0] => SObject Object
                                (
                                    [type] => type_2
                                    [fields] => 
                                    [sobjects] => Array
                                        (
                                            [0] => SObject Object
                                                (
                                                    [type] => type_3
                                                    [fields] => 
                                                    [sobjects] => Array
                                                        (
                                                            [0] => SObject Object
                                                                (
                                                                    [type] => type_4
                                                                    [fields] => 
                                                                    [sobjects] => Array
                                                                        (
                                                                            [0] => SObject Object
                                                                                (
                                                                                    [type] => type_5
                                                                                    [fields] => 
                                                                                    [Id] => 12345_I_need_this
                                                                                )

                                                                        )

                                                                )

                                                        )

                                                )

                                        )

                                )

                        )

                )

        )

    [size] => 1
)

أحتاج إلى هذه المعرفية من النوع_5، كيف يمكنني الحصول على هذا في حل بسيط.

بعض النقاط الأخرى للتفكير في:

  • لن أعرف كيف كبيرة أو مدى عمق كائن الصفائف سوف يذهب، قد يكون أكثر أو أقل من 5

لقد سمعت عن العودية، لكن هف لم أجد أي شيء أعتقد أنه يمكنني استخدام ذلك يبقيه بسيطا. ربما بعض البرامج التعليمية الأفضل سيساعدني. إذا كنت أعلم بأي جزء من مجموعة الكائنات، فقد كانت القيمة التي أحتاج إليها، هل يمكنني فقط الاتصال بها مباشرة؟ شيء مثل: $ كائن [5] -> معرف ؟؟

هل كانت مفيدة؟

المحلول

هنا هو كيف يعمل العودية (عموما)

function recursiveFunctionName( input ) // returns value;
{
    //Do something to input to make it new_input

    if( isSomethingAccomplished )
    {
        return value;
    }
    else
    {
        return recursiveFunctionName( new_input );
    }
}

تبدأ بإدخال، وأخبر الوظيفة بالمتابعة لاستدعاء نفسها حتى تتمكن من إرجاع إخراج صالح. في حالتك، يمكنك القيام بذلك بهذه الطريقة:

function getID( SObject $so )
{
    // equates to isSomethingAccomplished...  You have found the value
    // you want returned, so pass that out.
    if( $so->id )
    {
        return $so->id;
    }
    else
    {
        // otherwise, this will return the value from the next level, 
        // pass that out.
        # SEE BELOW FOR ONE MORE NOTE HERE.
        return getID( $so->sobjects[ 0 ] );
    }
}

الآن، نظرا لأنك تستخدم صفيفا ل SOBjects، فقد ترغب في استبدال السطر أدناه #see أدناه، بما يلي:

$objs  = $so->sobjects;
$count = count( $objs );

// Iterate through all of its children, testing each of the child nodes.
// (You're actually using iteration and recursion in combination here).
for( $i = 0; $i < $count; $i++ )
{
    $curr = getID( $objs[ $i ] );

    // This is the same test as above.
    if( $curr )
    {
        return $curr;
    }
}

نصائح أخرى

انه بسيط جدا:

class SObject{
/*...*/

    public getId(){
        if(isset($this->Id)){
            return $this->Id;
        } else {
            return $this->sobjects[0]->getId();
        }
    }
}

وأنت تسميه

$id = $query_obj->getId();

تفريغ هذا ك XML واستخدام XPath عليه إذا كنت بحاجة إلى جعل الكثير من الاستفسارات على هذا الهيكل

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top