{"id":225,"date":"2014-09-08T12:04:10","date_gmt":"2014-09-08T15:04:10","guid":{"rendered":"http:\/\/arielnavarrete.wordpress.com\/?p=225"},"modified":"2014-09-08T12:04:10","modified_gmt":"2014-09-08T15:04:10","slug":"ordenar-un-array-de-objectos-en-php","status":"publish","type":"post","link":"https:\/\/arielnavarrete.cl\/blog\/2014\/09\/08\/ordenar-un-array-de-objectos-en-php\/","title":{"rendered":"Ordenar un array de objectos en Symfony2"},"content":{"rendered":"<p>Mientras estaba desarrollando un proyecto en Symfony2, tuve la necesidad de agrupar dos Entidades que tenian informacion similar, por ejemplo tenia una Entidad <strong>Liquidacion<\/strong> y otra <strong>LiquidacionesSA<\/strong>, esta ultima simulaba una Liquidacion pero contenia otra informacion, ambas tenian un mes, un a\u00f1o, un codigo y estaban asociadas a una Entidad padre llamada <strong>LiquidacionResumen<\/strong>, el problema fue cuando necesite listar todas las Liquidaciones que tenia <strong>LiquidacionResumen<\/strong> en donde debia incluir tanto las Entidades Liquidacion y LiquidacionSA, obviamente debian ir ordenadas por codigo para mostrar una concordancia correlativa entre ellas, por ultimo mencionar que la asociacion entre ellas devolvia un ArrayCollection.<\/p>\n<p><!--more Seguir leyendo...--><\/p>\n<p>Pues bien, empeze a buscar y me encontre con este <a title=\"http:\/\/stackoverflow.com\/questions\/1462503\/sort-array-by-object-property-in-php\" href=\"http:\/\/stackoverflow.com\/questions\/1462503\/sort-array-by-object-property-in-php\" target=\"_blank\">post<\/a> en donde existian varias formas, personalmente me gusta encontrar una solucion optima pero sin muchas lineas de codigo, por lo tanto ocupe la segunda opcion que brinda ese post, asi que llegue a esto.<\/p>\n<p>Lo primero recordar que nuestra asociacion es un ArrayCollection como mencionaba anteriormente, pero nuestro proceso\u00a0requiere un array normal.<\/p>\n<p>Creamos una funcion dentro de nuestra Entidad <strong>LiquidacionResumen<\/strong><\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\n\npublic function getListaLiquidaciones()\n{\n\u00a0\u00a0\u00a0 $listado = $this-&amp;gt;getLiquidacion()-&amp;gt;toArray();\n\u00a0\u00a0 \u00a0$listadoSA = $this-&amp;gt;getLiquidacionSA()-&amp;gt;toArray();\n\u00a0\u00a0 \u00a0\n\u00a0\u00a0\u00a0 $listado = array_merge($listado, $listadoSA);\n\n\u00a0 \u00a0 usort($listado, function($a, $b)\n\u00a0\u00a0 \u00a0{\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0$codA = $a-&amp;gt;getCodigo();\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0$codB = $b-&amp;gt;getCodigo();\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return $codA == $codB ? 0 : ( $codA &amp;gt; $codB ) ? 1 : -1;\u00a0\u00a0\u00a0\n\u00a0\u00a0 \u00a0});\n\u00a0\u00a0 \u00a0\n\u00a0\u00a0 \u00a0return $listado;\n}\n\n<\/pre>\n<p>Como requerimos un array normal, ocupamos\u00a0toArray(), una funcion entregada por nuestro ArrayCollection.<\/p>\n<p>Hacemos un<a title=\"http:\/\/cl1.php.net\/manual\/es\/function.array-merge.php\" href=\"http:\/\/cl1.php.net\/manual\/es\/function.array-merge.php\" target=\"_blank\"><strong> array_merge<\/strong><\/a> de nuestros dos listado de Liquidaciones, ahora existe un array llamado <strong>listado<\/strong> que contiene Liquidacion y LiquidacionSA.<\/p>\n<p>Por ultimo, nuestra <a title=\"http:\/\/cl1.php.net\/manual\/es\/function.usort.php\" href=\"http:\/\/cl1.php.net\/manual\/es\/function.usort.php\" target=\"_blank\"><strong>usort<\/strong> <\/a>que llama a una funcion recursiva la cual se encargara de ordenar, notece que deje en una variable llamada <strong>codA<\/strong> y <strong>codB<\/strong> los codigos para que se viera mas claramente por lo que deseamos comparar.<\/p>\n<p>Si por ejemplo digamos que nuestra Liquidacion tienen una asociacion con <strong>Propiedad<\/strong>, y esta Entidad es la que tiene un codigo podemos ocuparlo tambien:<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\n\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0$codA = (is_object($a-&amp;gt;getPropiedadId())) ? $a-&amp;gt;getPropiedadId()-&amp;gt;getCodigo() : 0;\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0$codB = (is_object($b-&amp;gt;getPropiedadId())) ? $b-&amp;gt;getPropiedadId()-&amp;gt;getCodigo() : 0;\n\n<\/pre>\n<p>La funcion <a title=\"http:\/\/php.net\/manual\/es\/function.is-object.php\" href=\"http:\/\/php.net\/manual\/es\/function.is-object.php\" target=\"_blank\">is_object<\/a> nos permite verificar si efectivamente existe una relacion, pero \u00bfporque? pues simple, cada relacion que tu tengas con otra tabla debera retornar un Objeto (siempre y cuando sea una relacion uno a uno, de lo contrario retornara un ArrayCollection por ejemplo uno a muchos), por lo tanto si no retorna un objeto, no existe relacion, de ser asi seteamos un cero.<\/p>\n<p>En algunas funciones ocupan <strong>strcmp<\/strong> para comparar, personalmente no me dio el resultado esperado, ya que no ordenaba de manera correcta.<\/p>\n<p>Bueno, y eso seria todo, ahora llamamos a nuestra funcion <strong>getListaLiquidaciones()<\/strong> y listo nos retornara los dos listados ordenados.<\/p>\n<p>Saludos<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Mientras estaba desarrollando un proyecto en Symfony2, tuve la necesidad de agrupar dos Entidades que tenian informacion similar, por ejemplo tenia una Entidad Liquidacion y otra LiquidacionesSA, esta ultima simulaba una Liquidacion pero contenia otra informacion, ambas tenian un mes, un a\u00f1o, un codigo y estaban asociadas a una Entidad padre llamada LiquidacionResumen, el problema [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8,12],"tags":[23,25],"class_list":["post-225","post","type-post","status-publish","format-standard","hentry","category-php-2","category-symfony2-2","tag-php","tag-symfony2"],"_links":{"self":[{"href":"https:\/\/arielnavarrete.cl\/blog\/wp-json\/wp\/v2\/posts\/225","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/arielnavarrete.cl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/arielnavarrete.cl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/arielnavarrete.cl\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/arielnavarrete.cl\/blog\/wp-json\/wp\/v2\/comments?post=225"}],"version-history":[{"count":0,"href":"https:\/\/arielnavarrete.cl\/blog\/wp-json\/wp\/v2\/posts\/225\/revisions"}],"wp:attachment":[{"href":"https:\/\/arielnavarrete.cl\/blog\/wp-json\/wp\/v2\/media?parent=225"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/arielnavarrete.cl\/blog\/wp-json\/wp\/v2\/categories?post=225"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/arielnavarrete.cl\/blog\/wp-json\/wp\/v2\/tags?post=225"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}