2016-08-25 2 views
0

J'ai une requête Laravel retournant une liste. J'ai besoin de filtrer cette liste et de choisir un élément aléatoire après le filtrage.Accès à une liste éloquente sous la forme d'un tableau d'objets dans Laravel 4

$places = getPlaces(); 
if (count($places) > 0) {   
    $places = array_filter($places, "filter"); // 2016/08/25: see http://php.net/manual/en/function.array-filter.php 

    $randomPlace = $places[rand(0, count($places) - 1)]; 
} 

Cela donne une erreur:

array_filter() expects parameter 1 to be array, object give 

Si je jetai $places à revête l'erreur va, mais je reçois rien:

$places = getPlaces(); 
if (count($places) > 0) { 
    $places = (array)$places;  
    $places = array_filter($places, "filter"); 

    $randomPlace = $places[rand(0, count($places) - 1)]; 
} 

Quand je vérifie count($places) je vois qu'il n'y a qu'un seul élément . Le résultat a plusieurs.

Pour contourner le problème du filtre que j'utilise Eloquent de toArray():

if (count($places) > 0) { 

    $places = $places->toArray(); 

    $places = array_filter($places, "filter"); 

    if (count($places) > 0) { 
     $randomPlace = $places[rand(0, count($places) - 1)]; 
    } 

} 

Cela fonctionne pour filter mais je terre en deux défis:

  1. Je ne peux pas accéder à $ randomPlace comme un objet par exemple $ randomPlace-> nom. Je dois utiliser l'accès au tableau, $ randomPlace ['nom']. Comme il existe d'autres méthodes qui attendent un objet, cela signifie qu'il faut changer/convertir toutes ces méthodes.

  2. $ lieux [rand (0, count ($ places) - 1)] donne une erreur, par exemple:

    Undefined offset: 4

Autre que d'avoir à changer toutes les méthodes à utiliser arrays place (objects (perdant de ce fait la fonctionnalité), pour l'instant la seule autre méthode de ma tête est de créer une fonction qui itère sur $ places et place les objets dans un tableau.

Existe-t-il une meilleure façon de gérer cela?

Merci.

+0

Vous pouvez utiliser la méthode de collecte '$ places-> filter ('filter')' ou essayer d'obtenir les valeurs uniquement en utilisant 'array_values ​​($ places)'. Ma conjecture est que 'array_filter' préserve les clés et supprime l'élément où key = 4. –

Répondre

2

Il semble que vous travaillez avec une collection et que vous trébuchiez lorsque vous la convertissez en tableau dans lequel vous pouvez utiliser array_filter. Au lieu de cela, utilisez les méthodes de collecte intégrées pour le filtrage et la récupération d'un élément aléatoire:

$randomItem = $places->filter('filter')->random(); 

Dans l'exemple ci-dessus, l'argument de la méthode filter() est le nom de votre fonction de filtre. Je recommande d'appeler cela autre chose que filter pour améliorer la lisibilité. :)

+0

Merci, cela fonctionne parfaitement. C'était aussi génial d'apprendre sur les collections en PHP. Une chose que j'ai remarquée, cependant, le 'filter 'des collections ne prend pas de' string' en tant que paramètre mais de 'closure'. –