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;