Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Cambiar claves/valores a array multidimensional

Estas en el tema de Cambiar claves/valores a array multidimensional en el foro de PHP en Foros del Web. Hola, el objetivo final es agregar automáticamente enlaces a los números de esta lista @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código HTML: Ver original < ul >     ...
  #1 (permalink)  
Antiguo 16/03/2013, 18:02
Avatar de metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.027
Antigüedad: 20 años, 5 meses
Puntos: 832
Cambiar claves/valores a array multidimensional

Hola, el objetivo final es agregar automáticamente enlaces a los números de esta lista

Código HTML:
Ver original
  1. <ul>
  2.     <li>Caso 1 (Art. 500).</li>
  3.     <li>Caso 2 (Art. 600-a).</li>
  4.     <li>Caso 3 (Art. 700 y 1000).</li>
  5.     <li>Caso 4 (Art. 800-a y 1000).</li>
  6.     <li>Caso 5 (Art. 900 y 1000-a).</li>
  7.     <li>Caso 6 (Art. 999-a y 1000-b).</li>
  8.     <li>Caso 7 (Art. 320, 497, 68, 5, 2360-e, 410 y 903).</li>
  9. </ul>

El sistema debe encontrar automáticamente las coincidencias y convertirlas en algo como esto:

Código HTML:
Ver original
  1. <ul>
  2.     <li>Caso 1 (Art. <a href="http://sitio.com/art-500">500</a>).</li>
  3.     <li>Caso 2 (Art. <a href="http://sitio.com/art-600">600-a</a>).</li>
  4.     <li>Caso 3 (Art. <a href="http://sitio.com/art-700">700</a> y <a href="http://sitio.com/art-1000">1000</a>).</li>
  5.     ...
Por supuesto además de la lista existe un montón de texto extra. La forma más lógica que pude pensar fue convertir lista y datos en arrays para luego encararlas con strtr(), de manera que el reemplazo se haga sólo en la zona indicada (en lugar de ejecutarse en otra coincidencia que exista en el texto completo). Lo hice de esta forma:

Código PHP:
Ver original
  1. $patron = "/\(Art. .*\)/";
  2. preg_match_all($patron , $html , $coinc); // $html es el texto;
  3.  
  4. $array = array();
  5.  
  6. foreach ($coinc[0] as $k => $v) {
  7.     $replace = preg_replace('/\(Art. (.*)\)/' , '$1' , $v);
  8.     $array[] = preg_split('/, | y /' , $replace);      
  9. }
Con esto logré sacar ambos arrays. El de los datos:

Código PHP:
Ver original
  1. print_r($array , true);
  2. // Resultado:
  3. (
  4.     [0] => Array
  5.         (
  6.             [0] => 500
  7.         )
  8.  
  9.     [1] => Array
  10.         (
  11.             [0] => 600-a
  12.         )
  13.  
  14.     [2] => Array
  15.         (
  16.             [0] => 700
  17.             [1] => 1000
  18.         )
  19.  
  20.     [3] => Array
  21.         (
  22.             [0] => 800-a
  23.             [1] => 1000
  24.         )
  25.  
  26.     [4] => Array
  27.         (
  28.             [0] => 900
  29.             [1] => 1000-a
  30.         )
  31.  
  32.     [5] => Array
  33.         (
  34.             [0] => 999-a
  35.             [1] => 1000-b
  36.         )
  37.  
  38.     [6] => Array
  39.         (
  40.             [0] => 76
  41.             [1] => 763
  42.             [2] => 829
  43.             [3] => 860
  44.             [4] => 872
  45.             [5] => 879
  46.             [6] => 881-x
  47.             [7] => 921
  48.             [8] => 927
  49.             [9] => 928
  50.             [10] => 954
  51.             [11] => 1085
  52.             [12] => 1127
  53.             [13] => 1140
  54.         )
  55.  
  56. )
y el de las listas:

Código PHP:
Ver original
  1. print_r($coinc[0], true);
  2. // Resultado:
  3. (
  4.     [0] => (Art. 500)
  5.     [1] => (Art. 600-a)
  6.     [2] => (Art. 700 y 1000)
  7.     [3] => (Art. 800-a y 1000)
  8.     [4] => (Art. 900 y 1000-a)
  9.     [5] => (Art. 999-a y 1000-b)
  10.     [6] => (Art. 320, 497, 68, 5, 2360-e, 410 y 903)
  11. )
El problema que no logro resolver es que el array de datos salga así:

Código PHP:
Ver original
  1. (
  2.     [0] => Array
  3.         (
  4.             [500] => <a href="http://sitio.com/art-500">500</a>
  5.         )
  6.  
  7.     [1] => Array
  8.         (
  9.             [600-a] => <a href="http://sitio.com/art-600-a">600-a</a>
  10.         )
  11.  
  12.     [2] => Array
  13.         (
  14.             [700] => <a href="http://sitio.com/art-700">700</a>
  15.             [1000] => <a href="http://sitio.com/art-1000">1000</a>
  16.         )
  17.     ...
He tratado de modificar esas claves y valores, pero no puedo hacerlo sin que el array pierda la actual estructura. Agradecido a quien me pueda orientar. Dejo el archivo completo por si alguien quiere probar:

Código PHP:
Ver original
  1. <!DOCTYPE html>
  2. <html lang="es">
  3. <head>
  4. <meta charset="utf-8" />
  5. <title>Indice</title>
  6. <style type="text/css">
  7.     * { margin: 0; padding: 0; }
  8.     body { font: normal normal normal 13px Lucida Sans Unicode; background: #fff; }
  9. </style>
  10. </head>
  11. <body>
  12. <?php
  13. $html ='
  14. <ul>
  15.     <li>Caso 1 (Art. 500).</li>
  16.     <li>Caso 2 (Art. 600-a).</li>
  17.     <li>Caso 3 (Art. 700 y 1000).</li>
  18.     <li>Caso 4 (Art. 800-a y 1000).</li>
  19.     <li>Caso 5 (Art. 900 y 1000-a).</li>
  20.     <li>Caso 6 (Art. 999-a y 1000-b).</li>
  21.     <li>Caso 7 (Art. 320, 497, 68, 5, 2360-e, 410 y 903).</li>
  22. </ul>';
  23.  
  24. $patron = "/\(Art. .*\)/";
  25. preg_match_all($patron , $html , $coinc);
  26.  
  27. $array = array();
  28.  
  29. foreach ($coinc[0] as $k => $v) {
  30.     $replace = preg_replace('/\(Art. (.*)\)/' , '$1' , $v);
  31.     $array[] = preg_split('/, | y /' , $replace);      
  32. }
  33.  
  34. echo '<pre style="background: #efefef; font-family: Lucida Console; padding: 8px;margin-bottom: 8px;">'. print_r($array , true) .'</pre>';
  35. ?>
  36. </body>
  37. </html>
  #2 (permalink)  
Antiguo 16/03/2013, 20:11
 
Fecha de Ingreso: septiembre-2011
Mensajes: 219
Antigüedad: 13 años, 1 mes
Puntos: 31
Respuesta: Cambiar claves/valores a array multidimensional

Fijate si te sirve así:

Código PHP:
Ver original
  1. <!DOCTYPE html>
  2. <html lang="es">
  3. <head>
  4. <meta charset="utf-8" />
  5. <title>Indice</title>
  6. <style type="text/css">
  7.     * { margin: 0; padding: 0; }
  8.     body { font: normal normal normal 13px Lucida Sans Unicode; background: #fff; }
  9. </style>
  10. </head>
  11. <body>
  12. <?php
  13. $html ='
  14. <ul>
  15.    <li>Caso 1 (Art. 500).</li>
  16.    <li>Caso 2 (Art. 600-a).</li>
  17.    <li>Caso 3 (Art. 700 y 1000).</li>
  18.    <li>Caso 4 (Art. 800-a y 1000).</li>
  19.    <li>Caso 5 (Art. 900 y 1000-a).</li>
  20.    <li>Caso 6 (Art. 999-a y 1000-b).</li>
  21.    <li>Caso 7 (Art. 320, 497, 68, 5, 2360-e, 410 y 903).</li>
  22. </ul>';
  23.  
  24. $patron = "/\(Art. .*\)/";
  25. preg_match_all($patron , $html , $coinc);
  26.  
  27. $array = array();
  28.  
  29. foreach ($coinc[0] as $k => $v) {
  30.     $replace = preg_replace('/\(Art. (.*)\)/' , '$1' , $v);
  31.     $array[$k] = preg_split('/, | y /' , $replace);
  32.     if(count($array[$k]) == 1){
  33.         $array[$k] = '<a href="http://sitio.com/art-'.$replace.'">'.$replace.'</a>';  
  34.     }else{
  35.         foreach($array[$k] as $key => $value){
  36.             $array[$k][$key] = '<a href="http://sitio.com/art-'.$value.'">'.$value.'</a>';
  37.         }
  38.     }
  39. }
  40.  
  41. echo '<pre style="background: #efefef; font-family: Lucida Console; padding: 8px;margin-bottom: 8px;">'. print_r($array , true) .'</pre>';
  42. ?>
  43. </body>
  44. </html>

Saludos
  #3 (permalink)  
Antiguo 17/03/2013, 10:39
Avatar de metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.027
Antigüedad: 20 años, 5 meses
Puntos: 832
Respuesta: Cambiar claves/valores a array multidimensional

Excelente cachusan, muchas gracias!. Luego de aplicar tu código sólo fue cuestión de hacer un implode para emparejar ambos arrays y luego aplicar un str_replace(). La cosa quedó así:

Código PHP:
Ver original
  1. $patron = "/\(Art. .*\)/";
  2. preg_match_all($patron , $html , $coinc);
  3.  
  4. $array = array();
  5.  
  6. foreach ($coinc[0] as $k => $v) {
  7.     $replace = preg_replace('/\(Art. (.*)\)/' , '$1' , $v);
  8.     $array[$k] = preg_split('/, | y /' , $replace);
  9.     if( count($array[$k]) == 1 ) {
  10.         $array[$k] = '<a href="http://sitio.com/art-'.$replace.'">'.$replace.'</a>';  
  11.     } else {
  12.         foreach($array[$k] as $key => $value)
  13.                 $array[$k][$key] = '<a href="http://sitio.com/art-'. $value .'">'. $value .'</a>';
  14.  
  15.             if( count($array[$k]) == 2 )
  16.                 $array[$k] = implode (' y ' , $array[$k]);
  17.  
  18.             else
  19.                 $array[$k] = implode (', ' , $array[$k]);
  20.     }
  21.             $array[$k] = '(Art. '. $array[$k] .')';
  22. }
  23.  
  24. $html = str_replace($coinc[0] , $array , $html);
Gracias de nuevo!
  #4 (permalink)  
Antiguo 17/03/2013, 11:02
 
Fecha de Ingreso: septiembre-2011
Mensajes: 219
Antigüedad: 13 años, 1 mes
Puntos: 31
Respuesta: Cambiar claves/valores a array multidimensional

Excelente,

Etiquetas: html, multidimensional, patron, reemplazar
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 12:15.