web-dev-qa-db-ja.com

ブレードを使用してforeachループでキーを取得しようとする

{{$node[0]->url}}を使用すると、Laravelのテンプレートエンジンは正しい結果を表示しますが、@ foreachループ内で@for $ i = 0を使用してすべてを表示する方法がわかりません。これがルートファイルにあるものです。

$oReturn = new stdClass();
        $fid='endpoints';//sample fid

        $url = 'http://localhost:5493/sdata/$system/registry/'.$fid;

        $xml = simplexml_load_file($url);
        foreach($xml->xpath("//sdata:payload") as $entry) {
            // xpath here must be from payload to endPoint--type
            $content = $entry->xpath("./sdata:endPoint--type");

            foreach($content as $c) {
                // Make set of children with prefix sdata
                $nodes = $c->children('sdata', true);

            }

// add parsed data to the array
            $oReturn->entry[] = $nodes;

        }
        return View::make('index', compact('oReturn'));

これがビューファイルで試したことです

@for($i=0; $i < 4; $i++)
@endfor
@foreach ($oReturn as $node)
   <li>{{$node[$i]->url}}</li>
@endforeach

すみません、完全なprint_rの結果です

Array ( [oReturn] => stdClass Object 
( [entry] => Array 
    ( 
        [0] => SimpleXMLElement Object ( [description] => Sage 50 Accounts [protocol] => http [Host] => base_3 [applicationName] => accounts50 [contractName] => SimpleXMLElement Object ( ) [dataSetName] => - [url] => http://base_3:5493/sdata/accounts50 [isBrowsable] => true [aliveStamp] => 2015-11-06T23:31:10.031+00:00 ) 
        [1] => SimpleXMLElement Object ( [endPointType] => dataSet [applicationName] => accounts50 [contractName] => GCRM [dataSetName] => Enter Your Company Name [url] => http://base_3:5493/sdata/accounts50/GCRM/{C22ACA13-3C4C-4E33-A584-CD99BD3002A6} ) 
        [2] => SimpleXMLElement Object ( [endPointType] => dataSet [applicationName] => accounts50 [contractName] => GCRM [dataSetName] => Enter Your Company Name [url] => http://base_3:5493/sdata/accounts50/GCRM/{FF476636-D4AF-4191-BDE4-891EDA349A68} ) 
        [3] => SimpleXMLElement Object ( [endPointType] => dataSet [applicationName] => accounts50 [contractName] => GCRM [dataSetName] => Enter Your Company Name [url] => http://base_3:5493/sdata/accounts50/GCRM/{C62A13D5-3FFE-43B4-9DAF-38F9055A83C7} ) 
        [4] => SimpleXMLElement Object ( [description] => GCRM Contract [endPointType] => contract [protocol] => http [Host] => base_3 [applicationName] => accounts50 [contractName] => GCRM [dataSetName] => - [url] => http://base_3:5493/sdata/accounts50/GCRM [aliveStamp] => 2015-11-06T23:31:11.062+00:00 ) 
    ) 
) 
) 1
10
Artful_dodger

簡単な答えは、Bladeのforeachは通常のPHP foreach。と同じように機能するということです。

_@foreach ($nodes as $node)
    <li>{{ $node->url }}</li>
@endforeach
_

各ノードの配列キー値にアクセスする必要がある場合:

_@foreach ($nodes as $key => $node)
    <li>{{ $key }}: {{ $node->url }}</li>
@endforeach
_

ただし、問題はBlade構文ではなく、入力変数の作成方法にあると思われます。上記のコードで_$oReturn_を作成した方法を考えると、期待どおりのプロパティはありません。説明のために、作成しているように見えるものの簡略版を以下に示します。

_// initialize your return variable 
$oReturn = new stdClass();

// create a dummy array <sdata:x> nodes,
// to simulate $nodes = $c->children('sdata', true);
$node = new SimpleXMLElement('<sdata:x/>');
$nodes = [ $node, $node, $node ];

// simulate adding nodes to the array of entries 
$oReturn->entry[] = [ $node, $node, $node ];

// print out the resulting structure
print_r( compact( 'oReturn' ) );
_

戻ります:

_Array(
    [oReturn] => stdClass Object
        (
            [entry] => Array
                (
                    [0] => Array
                        (
                            [0] => SimpleXMLElement Object()
                            [1] => SimpleXMLElement Object()
                            [2] => SimpleXMLElement Object()
                        )
                )
        )
)
_

したがって、@foreach ($oReturn as $node)を実行すると、_$node_の値は_entry[]_配列になり、単一の要素、つまりノードの配列を持ちます。入力から、これらのノードにurl要素が含まれているかどうかは明らかではありません。ノードをループしたい場合は、次のようにする必要があります。

_@foreach ($oReturn->entry[0] as $node)
    <li>{{ $node->url }}</li>
@endforeach
_

これは理にかなっていますか? _$oReturn_の作成を再考する必要があると思います。

更新

以下のフィードバックと上記の_print_r_ステートメントの出力を考えると、次のように動作するはずです。

_@foreach ($oReturn->entry as $node)
    <li>{{ (string) $node->url }}</li>
@endforeach
_

_(string)_は、_$node->url_の結果を文字列にキャストします。そうでなければPHPはそれを何らかの種類のオブジェクトとして扱うかもしれません。SimpleXMLElementは奇妙です。

26
morphatic