variable print_r loop from for definir change array arrays symfony tags tag-cloud

arrays - print_r - twig get value from array



Symfony2-Acceder a la matriz de etiquetas que tiene valores está dando un error (1)

Estoy tratando de usar una matriz getTags () que es una matriz de matrices en otro método GetTagWeights ($ etiquetas) pero obtengo un error al usarla con esta línea:

$tagWeights[$tag] = (isset($tagWeights[$tag[''tag'']])) ? $tagWeights[$tag[''tag'']] + 1 : 1;

Obtuve el siguiente error:

ContextErrorException: Warning: Illegal offset type in /var/www/html/Satori/src/Symfony/AcmeBundle/Entity/TagRepository.php line 34

Pregunta: ¿Qué estoy haciendo mal aquí, he abandonado getTags () y hay datos?

Mi proceso consiste en obtener etiquetas y ponderar las etiquetas por popularidad. Tag se configura como una entidad ManyToMany / ManyToMany con una entidad Blog.

métodos getTags y getTagWeight (eliminar $ etiquetas de getTags () devuelve una matriz de matrices)

array (size=6) 0 => array (size=1) ''tag'' => string ''Tag 1'' (length=5) 1 => array (size=1) ''tag'' => string ''Tag 2'' (length=5) 2 => array (size=1) ''tag'' => string ''Tag 3'' (length=5) public function getTags() { $tags = $this->createQueryBuilder(''t'') ->select(''t.tag'') ->getQuery() ->getResult(); return $tags; } public function getTagWeights($tags) { $tagWeights = array(); if (empty($tags)) return $tagWeights; foreach ($tags as $tag) { $tagWeights[$tag] = (isset($tagWeights[$tag[''tag'']])) ? $tagWeights[$tag[''tag'']] + 1 : 1; } // Shuffle the tags uksort($tagWeights, function() { return rand() > rand(); }); $max = max($tagWeights); // Max of 5 weights $multiplier = ($max > 5) ? 5 / $max : 1; foreach ($tagWeights as &$tag) { $tag = ceil($tag * $multiplier); } return $tagWeights; }

Controlador

$em = $this->getDoctrine()->getManager(); $tags = $em->getRepository(''AcmeBundle:Tag'') ->getTags(); $tagWeights = $em->getRepository(''AcmeBundle:Tag'') ->getTagWeights($tags); // var_dump($tagWeights); die(); return array( ''tags'' => $tagWeights, );

Entidad de etiqueta

class Tag { /** * @var integer * * @ORM/Column(name="id", type="integer") * @ORM/Id * @ORM/GeneratedValue(strategy="AUTO") */ private $id; /** * @var string * * @ORM/Column(name="tag", type="string", length=255) */ private $tag; /** * @ORM/ManyToMany(targetEntity="Blog", mappedBy="tags") */ protected $blogs; public function __construct() { $this->blogs = new ArrayCollection(); } /** * Get id * * @return integer */ public function getId() { return $this->id; } /** * Set tag * * @param string $tag * @return Tag */ public function setTag($tag) { $this->tag = $tag; return $this; } /** * Get tag * * @return string */ public function getTag() { return $this->tag; } /** * Add blogs * * @param /AcmeBundle/Entity/Blog $blogs * @return Tag */ public function addBlog(/AcmeBundle/Entity/Blog $blogs) { $this->blogs[] = $blogs; return $this; } /** * Remove blogs * * @param /AcmeBundle/Entity/Blog $blogs */ public function removeBlog(/AcmeBundle/Entity/Blog $blogs) { $this->blogs->removeElement($blogs); } /** * Get blogs * * @return /Doctrine/Common/Collections/Collection */ public function getBlogs() { return $this->blogs; } }

Así es como estoy accediendo a las etiquetas en twig:

{% for tag, weight in tags %} <span class="weight-{{ weight }}"><a href="{{ path(''AcmeBundle_tag'', { ''tag'': tag.tag }) }}">{{ tag.tag }}</a></span> {% else %} <p>There are no tags</p> {% endfor %}


De la documentación :

Las matrices y los objetos no se pueden usar como claves. Si lo hace, aparecerá una advertencia: tipo de compensación ilegal .

Está intentando usar $tag como clave aquí:

$tagWeights[$tag] = (isset($tagWeights[$tag[''tag'']])) ? $tagWeights[$tag[''tag'']] + 1 : 1;

pero como $tag es una matriz, obtienes un error.

Supongo que querías hacer esto:

$tagWeights[$tag[''tag'']] = (isset($tagWeights[$tag[''tag'']])) ? $tagWeights[$tag[''tag'']] + 1 : 1;