Foros del Web » Programando para Internet » PHP »

Problema con array

Estas en el tema de Problema con array en el foro de PHP en Foros del Web. Apliqué file a un archivo externo; eso me devuelve el array simple de líneas. Cada línea que comienza con msgid va a la celda izquierda ...
  #1 (permalink)  
Antiguo 23/11/2010, 08:59
Avatar de metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.027
Antigüedad: 19 años, 10 meses
Puntos: 832
Problema con array

Apliqué file a un archivo externo; eso me devuelve el array simple de líneas. Cada línea que comienza con msgid va a la celda izquierda de una tabla, y las que comienzan con msgstr va a la derecha. Hasta ahí todo perfecto. Un ejemplo:

Esta parte del array...
Código PHP:
[138] => msgid "Someone"
[139] => msgstr "Alguien" 
... la separo así:

Código PHP:
foreach($leer as $l) {
    if(
substr($l05) == 'msgid')
        
$html .= '<tr><th scope="row">'$l .'</td>';
    if(
substr($l06) == 'msgstr')
        
$html .= '<td>'$l .'</td></tr>';

... y termina formateada de esta manera:
Código HTML:
<tr>
	<th scope="row">Someone</th>
	<td>Alguien</td>
</tr> 
El problema surge con casos especiales donde existe msgid seguido de msgsid_plural, a lo que le sigue msgstr[0] y msgstr[1], de esta forma:

Código PHP:
[1068] => msgid "%s comment approved"
[1069] => msgid_plural "%s comments approved"
[1070] => msgstr[0"%s comentario aprobado"
[1071] => msgstr[1"%s comentarios aprobados" 
¿Cómo le hago para que en este caso las celdas queden emparejadas así?:
Código PHP:
msgid        "con"  msgstr[0]
msgid_plural "con"  msgstr[1
El resultado deseado sería éste pero no sé cómo lograrlo:
Código PHP:
<tr>
    <
th scope="row">%s comment approved</th>
    <
td>%s comentario aprobado</td>
</
tr>
<
tr>
    <
th scope="row">%s comments approved</th>
    <
td>%s comentarios aprobados</td>
</
tr
  #2 (permalink)  
Antiguo 23/11/2010, 09:22
Avatar de Nano_  
Fecha de Ingreso: febrero-2006
Ubicación: Bogotá, Colombia
Mensajes: 1.866
Antigüedad: 18 años, 2 meses
Puntos: 96
Respuesta: Problema con array

Saludos

Podrías probar de la siguiente manera:

Código PHP:
Ver original
  1. foreach($leer as $l) {
  2.     if(substr($l, 0, 5) == 'msgid' && $l != 'msgid_plural')
  3.         $html .= '<tr><th scope="row">'. $l .'</td>';
  4.     if(substr($l, 0, 6) == 'msgstr' OR $l=='msgid_plural')
  5.         $html .= '<td>'. $l .'</td></tr>';
  6. }
__________________
:.:Nano.:: @nano_hard - Retornando al foro
  #3 (permalink)  
Antiguo 23/11/2010, 09:32
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Problema con array

Si lo que quieres es verificar siempre la primera palabra podrías usar str_word_count y tomas la primera palabra y luego comparas.

Edito:
También podrías usar explode para dividir por espacios y tomar la primera palabra.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #4 (permalink)  
Antiguo 23/11/2010, 09:32
Avatar de metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.027
Antigüedad: 19 años, 10 meses
Puntos: 832
Respuesta: Problema con array

Gracias Nano_. Lo que pasa es que en tu ejemplo, la celda correspondiente a msgid_plural estaría situada a la derecha y la necesito en la izquierda, acompañada de msgstr[1] :D
  #5 (permalink)  
Antiguo 23/11/2010, 09:34
Avatar de metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.027
Antigüedad: 19 años, 10 meses
Puntos: 832
Respuesta: Problema con array

Cita:
Iniciado por abimaelrc Ver Mensaje
Si lo que quieres es verificar siempre la primera palabra podrías usar str_word_count y tomas la primera palabra y luego comparas.
Gracias viejo. La comparación está lista, sólo faltaría casar una con otra.
  #6 (permalink)  
Antiguo 23/11/2010, 10:36
Avatar de Nano_  
Fecha de Ingreso: febrero-2006
Ubicación: Bogotá, Colombia
Mensajes: 1.866
Antigüedad: 18 años, 2 meses
Puntos: 96
Respuesta: Problema con array

Saludos

Si haces lo que te indica abimaelrc manejando un explode me párese que funcionaria.

Validando el indice anterior por el nuevo cuando recorre el foreach y si ahí coincidencias realizar el explode sobre la palabra msgid
__________________
:.:Nano.:: @nano_hard - Retornando al foro

Última edición por Nano_; 23/11/2010 a las 10:42
  #7 (permalink)  
Antiguo 23/11/2010, 11:03
Avatar de metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.027
Antigüedad: 19 años, 10 meses
Puntos: 832
Respuesta: Problema con array

Sí, con explode es que lo estoy solucionando. Ya les muestro.

Bah, no pude leer el "edito: " de abimaelrc. Si lo hubiese visto antes me hubiera ahorrado otros minutos de ira con esta vaina.
  #8 (permalink)  
Antiguo 23/11/2010, 16:06
Avatar de metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.027
Antigüedad: 19 años, 10 meses
Puntos: 832
Respuesta: Problema con array

Voy a aprovechar que en Venezuela estamos en época de besibol para darle un batazo a la mierda de computadora esta, y luego me doy otro por animal.

Éstas son las horas que todavía sigo con esta porquería de código y nada que arranca. He estado intentándolo durante todo el santo día. Me encuentro casi en el mismo punto que al inicio: los datos aparecen ordenados hasta que me encuentro con las malditas líneas repetidas; ahí se desbarata todo y no hallo la forma de ordenarlas una encima de otra. Estoy dando vueltas en círculo.

Éste es el más reciente intento:

Código PHP:
Ver original
  1. <?php
  2. $archivo = str_replace( basename($_SERVER['PHP_SELF']) , '' , $_SERVER['SCRIPT_FILENAME']) . '/lang/prueba.po';
  3. $leer = file($archivo, FILE_IGNORE_NEW_LINES);
  4. $html = null;
  5. $txt = null;
  6. foreach($leer as $l) {
  7.     $txt = explode(' ' , $l);
  8.     switch($txt[0]) {
  9.         case 'msgid':
  10.             $html .='<h3>'. $l .'</h3>' . "\n";
  11.         break;
  12.         case 'msgstr':
  13.             $html .='<p>'. $l .'</p>' . "\n";
  14.         break;
  15.         case 'msgstr[0]':
  16.             $html .='<p>'. $l .'</p>' . "\n";
  17.         break;
  18.         case 'msgid_plural':
  19.             $html .='<h3>'. $l .'</h3>' . "\n";
  20.         break;
  21.         case 'msgstr[1]':
  22.             $html .='<p>'. $l .'</p>' . "\n";
  23.         break;
  24.     }
  25. }
  26. echo $html;
  27. ?>

Así debería quedar la cosa: el texto en azul debería ir en la posición indicada.



Anexo archivo de prueba por si acaso:

Código PHP:
Ver original
  1. # Translation of WordPress 2.9.2.
  2. # Copyright (C) 2010 WordPress
  3. # This file is distributed under the same license as the WordPress package.
  4. # FIRST AUTHOR <EMAIL@ADDRESS>, 2010.
  5. #
  6. msgid ""
  7. msgstr ""
  8. "Project-Id-Version: WordPress 2.9.2 en español (v1.0)\n"
  9. "Report-Msgid-Bugs-To: [email protected]\n"
  10. "POT-Creation-Date: 2010-02-15 17:47+0000\n"
  11. "PO-Revision-Date: 2010-02-16 01:12+0100\n"
  12. "Last-Translator: \n"
  13. "Language-Team: TodoWordPress <[email protected]>\n"
  14. "MIME-Version: 1.0\n"
  15. "Content-Type: text/plain; charset=UTF-8\n"
  16. "Content-Transfer-Encoding: 8bit\n"
  17. "Plural-Forms: nplurals=2; plural=n !=1;\n"
  18. "X-Poedit-Language: Spanish\n"
  19. "X-Poedit-Country: SPAIN\n"
  20. "X-Poedit-SourceCharset: utf-8\n"
  21.  
  22. #: wp-admin/edit-attachment-rows.php:207
  23. msgid "Get permalink"
  24. msgstr "Obtener enlace permanente"
  25.  
  26. #: wp-admin/edit-attachment-rows.php:226
  27. #: wp-admin/upload.php:434
  28. msgid "No media attachments found."
  29. msgstr "No hay archivos que mostrar."
  30.  
  31. #: wp-admin/edit-category-form.php:14
  32. msgid "You do not have sufficient permissions to edit categories for this blog."
  33. msgstr "No tienes permisos para editar las categorías del blog."
  34.  
  35. #: wp-admin/edit-category-form.php:80
  36. #: wp-admin/edit-link-category-form.php:27
  37. #: wp-admin/includes/template.php:266
  38. msgid "Update Category"
  39. msgstr "Actualizar categoría"
  40.  
  41. #: wp-admin/edit-comments.php:114
  42. #, php-format
  43. msgid "Edit Comments on “%s”"
  44. msgstr "Editar comentarios en “%s”"
  45.  
  46. #: wp-admin/edit-comments.php:116
  47. msgid "Edit Comments"
  48. msgstr "Editar comentarios"
  49.  
  50. #: wp-admin/edit-comments.php:151
  51. #, php-format
  52. msgid "%s comment approved"
  53. msgid_plural "%s comments approved"
  54. msgstr[0] "%s comentario aprobado"
  55. msgstr[1] "%s comentarios aprobados"
  56.  
  57. #: wp-admin/edit-comments.php:155
  58. #, php-format
  59. msgid "%s comment marked as spam."
  60. msgid_plural "%s comments marked as spam."
  61. msgstr[0] "%s comentario ha sido marcado como spam"
  62. msgstr[1] "%s comentarios han sido marcados como spam"
  63.  
  64. #: wp-admin/edit-comments.php:157
  65. #: wp-admin/edit-comments.php:166
  66. #: wp-admin/edit-pages.php:170
  67. #: wp-admin/edit.php:171
  68. #: wp-admin/includes/image-edit.php:56
  69. #: wp-admin/includes/media.php:1243
  70. #: wp-admin/includes/template.php:2384
  71. #: wp-admin/includes/template.php:2387
  72. #: wp-admin/upload.php:210
  73. #: wp-includes/js/tinymce/langs/wp-langs.php:213
  74. #: wp-includes/js/tinymce/wp-mce-help.php:209
  75. msgid "Undo"
  76. msgstr "Deshacer"
  77.  
  78. #: wp-admin/edit-comments.php:160
  79. #, php-format
  80. msgid "%s comment restored from the spam"
  81. msgid_plural "%s comments restored from the spam"
  82. msgstr[0] "El comentario %s ha sido restaurado."
  83. msgstr[1] "Los comentarios %s han sido restaurados."
  84.  
  85. #: wp-admin/edit-comments.php:164
  86. #, php-format
  87. msgid "%s comment moved to the trash."
  88. msgid_plural "%s comments moved to the trash."
  89. msgstr[0] "%s comentario ha sido mandado a la papelera."
  90. msgstr[1] "%s comentarios han sido enviados a la papelera."
  #9 (permalink)  
Antiguo 23/11/2010, 16:48
Avatar de Nano_  
Fecha de Ingreso: febrero-2006
Ubicación: Bogotá, Colombia
Mensajes: 1.866
Antigüedad: 18 años, 2 meses
Puntos: 96
Respuesta: Problema con array

Cita:
Voy a aprovechar que en Venezuela estamos en época de besibol para darle un batazo a la mierda de computadora esta, y luego me doy otro por animal.
Ahora si me hiciste reir metacortex jejejeje

Se me ocurre que podrías manejarlo de la siguiente manera:
Código PHP:
Ver original
  1. <?php
  2. $archivo = str_replace( basename($_SERVER['PHP_SELF']) , '' , $_SERVER['SCRIPT_FILENAME']) . '/lang/prueba.po';
  3. $leer = file($archivo, FILE_IGNORE_NEW_LINES);
  4. $html = null;
  5. $txt = null;
  6. $cont=0;
  7. foreach($leer as $l) {
  8.     $txt = explode(' ' , $l);
  9.  
  10.     switch($txt[0]) {
  11.         case 'msgid':
  12.             $html[$cont]='<h3>'. $l .'</h3>' . "\n";
  13.     $valor[$cont]="";
  14.         break;
  15.         case 'msgstr':
  16.             $html[$cont]='<p>'. $l .'</p>' . "\n";
  17.         $valor[$cont]="";      
  18.         break;
  19.         case 'msgstr[0]':
  20.            
  21.             //validacion  si la posicion anterior es msgid_plurarl
  22.             if($valor[$cont-1]=="msgid_plural"){
  23.              $html[$cont]=$html[$cont-1];
  24.              $html[$cont-1]='<h3>'. $l .'</h3>' . "\n";
  25.             }else{
  26.              $html[$cont]='<h3>'. $l .'</h3>' . "\n";
  27.             }
  28.     $valor[$cont]="";
  29.         break;
  30.         case 'msgid_plural':
  31.             $html[$cont]='<h3>'. $l .'</h3>' . "\n";
  32.             $valor[$cont]="msgid_plural";
  33.         break;
  34.         case 'msgstr[1]':
  35.             $html[$cont]='<p>'. $l .'</p>' . "\n";
  36.     $valor[$cont]="";
  37.         break;
  38.     }
  39.     $cont++;
  40. }
  41. print_r($html);
  42. ?>

Espero se entienda la idea!!!.

EDITADO: Puede tener errores de sintaxys cable aclarar!-
__________________
:.:Nano.:: @nano_hard - Retornando al foro

Última edición por Nano_; 23/11/2010 a las 16:54
  #10 (permalink)  
Antiguo 23/11/2010, 22:45
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Problema con array

Trata algo así
Código PHP:
Ver original
  1. <?php
  2. $archivo = str_replace( basename($_SERVER['PHP_SELF']) , '' , $_SERVER['SCRIPT_FILENAME']) . '/lang/prueba.po';
  3. $leer = file($archivo, FILE_IGNORE_NEW_LINES);
  4. $arr = array();
  5. $bool = true;
  6. $n = 0;
  7. foreach($leer as $l){
  8.     $e = explode(' ', $l);
  9.     if(empty($e[0]) || $e[0] == '#'){ $bool = true; continue; }
  10.     $arr[$n][$e[0]] = $l;
  11.     if($bool){ $bool = false; $n++; }
  12. }
  13. foreach($arr as $a){
  14.     echo (!empty($a['msgid']) ? $a['msgid'] . '<br />' : '')
  15.         . (!empty($a['msgstr']) ? $a['msgstr'] . '<br />' : '')
  16.         . (!empty($a['msgstr[0]']) ? $a['msgstr[0]'] . '<br />' : '')
  17.         . (!empty($a['msgid_plural']) ? $a['msgid_plural'] . '<br />' : '')
  18.         . (!empty($a['msgstr[1]']) ? $a['msgstr[1]'] . '<br />' : '') . '<br />';
  19. }
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #11 (permalink)  
Antiguo 24/11/2010, 15:21
Avatar de metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.027
Antigüedad: 19 años, 10 meses
Puntos: 832
Respuesta: Problema con array

Cita:
Iniciado por Nano_ Ver Mensaje
Se me ocurre que podrías manejarlo de la siguiente manera:
Nano_, muchas gracias hombre. El código funciona a la perfección y además te fuiste por una vía que ni siquiera se me pasó por la cabeza. Cuando lo implementé anoche estuve un rato viendo cómo lo hiciste y francamente recibí una buena lección. Gracias hermano.

Abimael -como siempre- me dejó con la boca abierta. Código más reducido imposible. Mis respetos compa, muchas gracias. Algún día haré vainas así jejeje. Me encantó cómo además agrupas singular/plural. Aunque actualmente estoy probando full con éste, la cosa quedó así por ahora:

Código PHP:
Ver original
  1. $archivo = str_replace( basename($_SERVER['PHP_SELF']) , '' , $_SERVER['SCRIPT_FILENAME']) . '/lang/prueba.po';
  2. $leer = file($archivo, FILE_IGNORE_NEW_LINES);
  3. $html = null;
  4. $htm = null;
  5. $txt = null;
  6. $cont = 0;
  7. foreach($leer as $l) {
  8.     $valor[$cont] = null;
  9.     $txt = explode(' ' , $l);
  10.     switch($txt[0]) {
  11.         case 'msgid':
  12.             $html[$cont] = $l;
  13.         break;
  14.         case 'msgstr':
  15.             $html[$cont] = $l;
  16.         break;
  17.         case 'msgstr[0]':
  18.             // validacion  si la posicion anterior es msgid_plurarl
  19.             if($valor[$cont-1] == "msgid_plural"){
  20.                 $html[$cont] = $html[$cont-1];
  21.                 $html[$cont-1] = $l;
  22.             } else
  23.                 $html[$cont] = $l;
  24.         break;
  25.         case 'msgid_plural':
  26.             $html[$cont] = $l;
  27.             $valor[$cont] = "msgid_plural";
  28.         break;
  29.         case 'msgstr[1]':
  30.             $html[$cont] = $l;
  31.         break;
  32.     }
  33.     $cont++;
  34. }

Ésta es la salida HTML en la que estoy trabajando. Es un desastre por ahora pero va bien:

Código PHP:
Ver original
  1. foreach($html as $k => $h) {
  2.  
  3.     //$h = trim($h , '"');
  4.  
  5.     $v = explode(' ' , $h);
  6.     $o = array_slice($v, 1);
  7.     $e = implode (' ' , $o);
  8.     $e = htmlspecialchars(trim($e , '"'));
  9.  
  10.     // $reemp = array('msgid_plural' => 'PO' , 'msgstr' => 'T' , 'msgid' => 'O' , 'msgstr[1]' => 'PT' , 'msgstr[0]' => 'TS');
  11.     $reemp2 = array('msgid_plural' => 'Plural' , 'msgid' => 'Singular' );
  12.     // $v1 = strtr($v[0] , $reemp);
  13.     $v2 = strtr($v[0] , $reemp2);
  14.  
  15.     if(!empty($e)) {
  16.         if($v1 == 'O' or $v1 == 'PO' )
  17.             echo '
  18.        <tr>
  19.            <td class="tipo">'. $v2 .'</td>
  20.            <td class="original">
  21.                <p>'. $e .'</p>
  22.            </td>';
  23.         if($v1 == 'T' or $v1 == 'TS' or $v1 == 'PT' )
  24.             echo '
  25.            <td>
  26.                <div id="dato-'. $k .'">'. $e .'</div>
  27.            </td>
  28.        </tr>';
  29.     }
  30. }
  #12 (permalink)  
Antiguo 24/11/2010, 16:38
Avatar de Nano_  
Fecha de Ingreso: febrero-2006
Ubicación: Bogotá, Colombia
Mensajes: 1.866
Antigüedad: 18 años, 2 meses
Puntos: 96
Respuesta: Problema con array

Cita:
Iniciado por metacortex Ver Mensaje
Nano_, muchas gracias hombre. El código funciona a la perfección y además te fuiste por una vía que ni siquiera se me pasó por la cabeza. Cuando lo implementé anoche estuve un rato viendo cómo lo hiciste y francamente recibí una buena lección. Gracias hermano.
Con mucho gusto metacortex me alegra que halla funcionado como esperabas!.

Hasta Pronto!
__________________
:.:Nano.:: @nano_hard - Retornando al foro
  #13 (permalink)  
Antiguo 24/11/2010, 16:49
Avatar de metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.027
Antigüedad: 19 años, 10 meses
Puntos: 832
Respuesta: Problema con array

Estoy muy alegre. Desde entonces he adelantado un montón. Gracias de nuevo.
  #14 (permalink)  
Antiguo 26/11/2010, 13:12
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Problema con array

Bueno se me ocurrió que con expresiones regulares lo puedes hacer aún más compacto
Código PHP:
Ver original
  1. <?php
  2. $archivo = str_replace(basename($_SERVER['PHP_SELF']), '', $_SERVER['SCRIPT_FILENAME']) . '/lang/prueba.po';
  3. $leer = file($archivo, FILE_IGNORE_NEW_LINES);
  4.  
  5. $bool = true;
  6. $n = 0;
  7. $arr = array();
  8.  
  9. foreach($leer as $l){
  10.     preg_match('/^(\w+(?:\[\d\])?).*/is', $l, $m);
  11.     if(!empty($m[1])){ $arr[$n][$m[1]] = $m[0]; $bool = false; }
  12.     elseif(!$bool && empty($m[1])){ $bool = true; $n++; }
  13. }
  14. foreach($arr as $a){
  15.     echo (!empty($a['msgid']) ? $a['msgid'] . '<br />' : '')
  16.         . (!empty($a['msgstr']) ? $a['msgstr'] . '<br />' : '')
  17.         . (!empty($a['msgstr[0]']) ? $a['msgstr[0]'] . '<br />' : '')
  18.         . (!empty($a['msgid_plural']) ? $a['msgid_plural'] . '<br />' : '')
  19.         . (!empty($a['msgstr[1]']) ? $a['msgstr[1]'] . '<br />' : '') . '<br />';
  20. }

Tal vez, exista alguna forma aún más compacta pero con el poco tiempo que tengo pude hacer este ejemplo.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #15 (permalink)  
Antiguo 29/11/2010, 09:43
Avatar de metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.027
Antigüedad: 19 años, 10 meses
Puntos: 832
Respuesta: Problema con array

Juraba que había respondido a esto. Impresionante, sólo 3 líneas!. Aunque quizás me sigue gustando la primera versión que posteaste, ya que prescinde del motor de expresiones regulares.

Por cierto, sobre esto vi una jugada que me dejó lelo: Primero declaras $bool como true; luego dices que si $bool es true se convierta en false. Tardé un buen rato en descubrirle la lógica pero debo decirte que estuvo genial.
  #16 (permalink)  
Antiguo 29/11/2010, 11:14
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Problema con array

Bueno la primera vez que lo declaro, no es necesario en este caso, pero como me acostumbre a declararlas y por eso la dejé, es que si no declaras una variable puede que te dé error de notas y por eso lo hago.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #17 (permalink)  
Antiguo 29/11/2010, 12:56
Avatar de metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.027
Antigüedad: 19 años, 10 meses
Puntos: 832
Respuesta: Problema con array

Bueno es más que lógico acostumbrarse a declarar variables previamente a un loop ;). Quedas "perdonado".
  #18 (permalink)  
Antiguo 01/12/2010, 01:24
Avatar de metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.027
Antigüedad: 19 años, 10 meses
Puntos: 832
Respuesta: Problema con array

Bueno a estas alturas me decanté por la propuesta de las expresiones regulares. Le agregué la clave porque lo utilizaré para fijar la línea del archivo donde se va a escribir la línea:

Código PHP:
Ver original
  1. foreach($leer as $k => $l){
  2.     preg_match('/^(\w+(?:\[\d\])?).*/is', $l, $m);
  3.     if(!empty($m[1])){ $arr[$n][$m[1]] = $k + 1 .' '. $m[0]; $bool = false; }
  4.     elseif(!$bool && empty($m[1])){ $bool = true; $n++; }
  5. }

Cada array resultante luce de esta forma:

Código PHP:
Ver original
  1. [2] => Array
  2.         (
  3.             [msgid] => 28 msgid "No media attachments found."
  4.  
  5.             [msgstr] => 29 msgstr "No hay archivos que mostrar."
  6.  
  7.         )

Ahora bien, se hizo necesario extraer info por separado de cada línea para convertirla en datos que pueda usar. Hice el foreach para que se reconociera cada array (y sus elementos) como una iteración individual y -aquí creo que está el error- un bucle interno for para meterle el preg_match_all y separar por fin los datos:

Código PHP:
Ver original
  1. foreach($arr as $a) {
  2.     $values = array_values($a);
  3.     for ($i = 0; $i < count($values); $i++) {
  4.         preg_match_all('/^(.*?) (.*?) "(.*?)"/i', $values[$i], $salida, PREG_SET_ORDER);
  5.     }
  6. }

Cada iteración me devuelve lo esperado. Este print lo hice desde dentro del for (se muestra todo el array correctamente):

Código PHP:
Ver original
  1. (
  2.     [0] => Array
  3.         (
  4.             [0] => 29 msgstr "No hay archivos que mostrar."
  5.             [1] => 29
  6.             [2] => msgstr
  7.             [3] => No hay archivos que mostrar.
  8.         )
  9.  
  10. )
Pero el HTML debo construirlo desde el foreach y ahí se jode todo porque los datos comienzan a mostrarse de esa forma acumulativa (esa que va creciendo y en la última celda tiene toda la información junta). El HTML se genera con las repeticiones correctas, pero tiene ese defecto en el contenido. Las variables quedaron definidas así:

Código PHP:
Ver original
  1. $linea .= $salida[0][1];
  2. $tipo .= $salida[0][2];
  3. $titulo .= $salida[0][2] == 'msgid' ? $salida[0][3] : null;
  4. $titulo_p .= $salida[0][2] == 'msgid_plural' ? $salida[0][3] : null;
  5. $txt_s .= $salida[0][2] == 'msgstr[0]' ? $salida[0][3] : null;
  6. $txt .= $salida[0][2] == 'msgstr' ? $salida[0][3] : $txt_s;
  7. $txt_p .= $salida[0][2] == 'msgstr[1]' ? $salida[0][3] : null;
Y si las saco del for para colocarlas en el foreach (donde está el HTML que debe repetirse) entonces no funcionan. Ese es el problema.

Quisiera saber qué estoy haciendo mal. Los datos separados son necesarios para procesarlos debidamente pero -como obra de Satanás- viene a aparecer ese error cuando todo está casi hecho. Desde luego ya le he dado un montón de vueltas.
  #19 (permalink)  
Antiguo 01/12/2010, 12:16
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Problema con array

¿Cómo quieres que se vea?
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #20 (permalink)  
Antiguo 01/12/2010, 12:40
Avatar de metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.027
Antigüedad: 19 años, 10 meses
Puntos: 832
Respuesta: Problema con array

Hola Abimael, se ven bien, pero el array viene de forma acumulativa, como si ejecutara un echo desde dentro del loop, algo así:

Código PHP:
uno
uno dos
uno dos tres
uno dos tres cuatro 
  #21 (permalink)  
Antiguo 01/12/2010, 13:19
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: Problema con array

Bueno lo que se acumula no es el array, sino las variables que estás concatenando. Una forma de resolver es crear variables temporales que almacenen lo que deseas y fuera del bucle que estás usando para almacenar los datos que quieras. Un ejemplo se explica mejor
Código PHP:
Ver original
  1. <?php
  2. $array = array(
  3.     array(array('foo', 'bar')),
  4.     array(array('baz', 'candy')),
  5.     array(array('fruits', 'vegetable'))
  6. );
  7. $str = '';
  8. foreach($array as $arr){
  9.     $first = '';
  10.     $second = '';
  11.     foreach($arr as $a){
  12.         $first = $a[0];
  13.         $second = $a[1];
  14.     }
  15.     $str .= $first . ' - ' . $second . '<br />';
  16. }
  17. echo $str;
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos

Última edición por abimaelrc; 01/12/2010 a las 13:25
  #22 (permalink)  
Antiguo 01/12/2010, 14:12
Avatar de metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.027
Antigüedad: 19 años, 10 meses
Puntos: 832
Respuesta: Problema con array

Juaaaaaaa!!! Era eso hermano! Sólo tenía que definir las variables iniciales dentro del foreach y no fuera. Mil gracias por la ayuda Abimael.
  #23 (permalink)  
Antiguo 06/12/2010, 14:03
Avatar de metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.027
Antigüedad: 19 años, 10 meses
Puntos: 832
Respuesta: Problema con array

Bueno aquí estoy jodiendo la paciencia otra vez. Sucede que también necesito extraer otras líneas además de [msgid], [msgstr] y las demás mencionadas. Se trata de [#:] y [#,]. Ambas son importantes para el proyecto y hasta hace poco no lo había tomado en cuenta.

Utilicé el código del pana Abimael para esto, modificando la expresión regular contenida en el preg_match:

Código PHP:
Ver original
  1. foreach($leer as $k => $l){
  2.     // preg_match('/^(\w+(?:\[\d\])?).*/is', $l, $m); Original
  3.     preg_match('/^(#(\:|,).*|\w+(?:\[\d\])?).*/', $l, $m); // Modificada
  4.     if(!empty($m[1])){
  5.         $arr[$n][$m[1]] = $k + 1 .' '. $m[0];
  6.         $bool = false;
  7.     }
  8.     elseif(!$bool && empty($m[1])) {
  9.         $bool = true;
  10.         $n++;
  11.     }
  12. }
Entonces me devuelve este resultado (ejemplo):

Código PHP:
Ver original
  1. [4] => Array
  2.         (
  3.             [#: wp-admin/edit-category-form.php:80] => 35 #: wp-admin/edit-category-form.php:80
  4.            [#: wp-admin/edit-link-category-form.php:27] => 36 #: wp-admin/edit-link-category-form.php:27
  5.            [#: wp-admin/includes/template.php:266] => 37 #: wp-admin/includes/template.php:266
  6.            [msgid] => 38 msgid "Update Category"
  7.             [msgstr] => 39 msgstr "Actualizar categoría"
  8.         )
Fíjense que al array [: ...] lo acompaña el texto de toda la línea. Lo ideal es que quede así:

Código PHP:
Ver original
  1. [4] => Array
  2.         (
  3.             [#:] => 35 #: wp-admin/edit-category-form.php:80
  4.            [#:] => 36 #: wp-admin/edit-link-category-form.php:27
  5.            [#:] => 37 #: wp-admin/includes/template.php:266
  6.            [msgid] => 38 msgid "Update Category"
  7.             [msgstr] => 39 msgstr "Actualizar categoría"
  8.         )
Creo que el problema es el primer asterisco de la expresión; ésta se acomoda cuando se lo quito, pero en contraparte sólo muestra un "[:]" dejando por fuera a los demás (en los casos de arrays con muchos "[:]") ¿Cuál es la manera correcta de configurar esa expresión?.
  #24 (permalink)  
Antiguo 06/12/2010, 15:11
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Problema con array

el punto es que si usas el mismo índice #: para todos los casos se sobre escribirá el valor todas las veces...

algo que se me ocurre es que concatenes algún otro valor a dicho índice, formando así un nuevo índice tipo #:N, donde N puede ser un valor incremental... o bien, relativo a tus datos... (:
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #25 (permalink)  
Antiguo 07/12/2010, 01:57
Avatar de metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.027
Antigüedad: 19 años, 10 meses
Puntos: 832
Respuesta: Problema con array

Gracias pateketrueke.

Bueno, acabo de resolverlo, creo que quedó bien. Usé el código de abimaelrc tal cual, con las mismas modificaciones descritas en el anterior post. Luego agregué:

Código PHP:
Ver original
  1. foreach($arr as $clave => $valor){
  2.     // Algunas variables como null
  3.     if (is_array($valor)) {
  4.         foreach($valor as $c => $v) {
  5.             $exp = explode(' ' , $v);
  6.             // Aquí le asigno valores a las variables y las condiciono con $v[1];
  7.         }
  8.     }
  9.     // Aquí le doy al HTML
  10. }
Hasta aquí me dio el coco por hoy. Y la cosa trae "moraleja": Creo que anteriormente me estaba esforzando demasiado en lograr un "[#]" en la clave del primer array, cuando en realidad lo importante era agrupar los elementos de forma correcta, es decir, de todas maneras el segundo loop iba a tener lugar, así que para qué molestarse con las claves del primero. Una vez "descubierto" esto, se me prendió la neurona y comencé a encarrilar el asunto por lo que hasta ahora creo que es la vía correcta y chao pescao.

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:58.