web-dev-qa-db-fra.com

Essayer d'obtenir la clé d'une boucle foreach pour qu'elle fonctionne avec une lame

si j'utilise {{$node[0]->url}} puis le moteur de création de modèles de Laravel affiche le résultat correct mais je ne peux pas comprendre comment afficher tout en utilisant le @for $ i = 0 dans une boucle @foreach c'est ce que j'ai dans mon fichier de routes

$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'));

et c'est ce que j'ai essayé dans mon fichier de vue

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

désolé voici le résultat complet de 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

La réponse est simple: foreach dans Blade fonctionne de la même manière qu'un PHP foreach. Vous devriez pouvoir faire quelque chose comme:

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

Si vous avez besoin d'accéder à la valeur de clé de tableau pour chaque nœud:

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

Cependant, je pense que le problème n'est peut-être pas avec votre syntaxe Blade, mais avec la façon dont vous avez créé vos variables d'entrée. Étant donné la façon dont vous avez créé $oReturn Dans le code ci-dessus, il n'aura pas les propriétés que vous attendez. Pour illustrer, voici une version simplifiée de ce que vous semblez créer:

// 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' ) );

retournerais:

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

Donc quand vous faites @foreach ($oReturn as $node) la valeur de $node Serait le tableau entry[], Qui a un seul élément, c'est-à-dire un tableau de nœuds. Il ne ressort pas clairement de votre entrée que ces nœuds ont même des éléments url. Si vous vouliez parcourir les nœuds, vous devriez faire quelque chose comme:

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

Est-ce que ça a du sens? Je pense que vous devez repenser votre création de $oReturn.

Mise à jour

Compte tenu des commentaires ci-dessous et de la sortie de votre instruction print_r Ci-dessus, les éléments suivants devraient fonctionner:

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

Le (string) Convertit le résultat de $node->url En chaîne. Sinon PHP peut le traiter comme une sorte d'objet. SimpleXMLElement peut être bizarre.

26
morphatic