Tengo una matriz masiva con los siguientes elementos:

array(
    array('url' => 'http://someurl.com', 'param' => array(false,true,true,true)), 
    array(...),
    array(...),
    ...
)

Los valores "booleanos" significan algunos parámetros (sin índice, encabezado, pie de página, barra lateral).

Necesito modificar esta matriz para una mejor comprensión (algunos usuarios no pueden entender qué significan los valores "booleanos").

Puedo agregar nombres de parámetros como este:

array(
    array(
         'url' => 'http://someurl.com', 
         'param' => array(
                         'noindex' => false, 
                         'header' => true,
                         'footer' => true,
                         'sidebar' => true
                    )
    ), 
    array(...),
    array(...),
    ...
)

Pero este método aumenta demasiado el tamaño de la matriz.

¿Cómo puedo simplificar la matriz?

¡Gracias!

0
imCaps 22 ene. 2015 a las 16:16

3 respuestas

La mejor respuesta

La mejor solución que he encontrado es el uso de constantes de clase y operadores bit a bit.

// Here we declare constants
const NOINDEX =     0b00000001,
      HEADER =      0b00000010,
      FOOTER =      0b00000100,
      SIDEBAR =     0b00001000;

// Here is array that I can understand without comparing boolean values with documentation
$urls = array(
        array('url' => 'http://someurl.com/', 'param' => self::NOINDEX | self::HEADER | self::FOOTER),
        array('url' => 'http://somesecondurl.me/blogs', 'param' => self::HEADER | self::FOOTER | self::SIDEBAR), 
        ...

//And of course using it
 $param = $urls[i]['param'];

 if ($param & self::HEADER) // Means that url have param HEADER
 if ($param & self::FOOTER) ...
 if ($param & self::SIDEBAR) ...
0
imCaps 23 ene. 2015 a las 12:48

Si desea simplificar la matriz como mencionó, puede usar matrices asociativas. Sin embargo, este enfoque solo se ajusta si la URL tiene valores únicos:

$tArray = array($tUrl1 =>array(
         'param' => array(
                         'noindex' => false, 
                         'header' => true,
                         'footer' => true,
                         'sidebar' => true
                    )
    ),
    $tUrl2 =>array(
         'param' => array(
                         'noindex' => false, 
                         'header' => true,
                         'footer' => true,
                         'sidebar' => true
                    )
    )
) 

La ventaja de usar este enfoque es la facilidad para llamar valores anidados como param.

$tArray[$tUrl1]['param'];
0
mirza.adipradhana 22 ene. 2015 a las 14:13

No hay forma de modificar para comprender, sin pagar el precio.

La única forma es agregar un comentario para la matriz.

array(
    array(
         'url' => 'http://someurl.com', 
         'param' => array(
                          false, //noindex
                          true,//header
                    )
    ), 
    array(...),
    array(...),
    ...
)

Pero si todos los elementos de la matriz son iguales, puede hacer esto.

array(
'url' => array('url1','url2',...),
'param'=>array(
    'noindex'=>array(true,false,...),
    'header'=>array(true,false,...)
));

Creo que no es demasiado importante reducir el uso de la memoria. porque si no asigna un índice, PHP lo agrega automáticamente. no hay mucha diferencia entre una matriz con una cadena o un entero.

Creo que puedes tener un segundo código sin ningún problema.

0
Ali Akbar Azizi 22 ene. 2015 a las 13:28