¿Es posible recorrer todos los elementos de dos matrices utilizando foreach?

votos
1

Tengo dos matrices: $Formsy $formsShared.

<?php foreach ($Forms as $r): ?>
    $(#shareform<?=$r['Form']['id'];?>).hide();
    $(.Share<?=$r['Form']['id'];?>).click(function () {
        $(#shareform<?=$r['Form']['id'];?>).toggle(show);
    });
<?php endforeach; ?>

Actualmente, tengo esta función ocultar y alternar para cada uno Formen la $Formsmatriz. Quiero que estas funciones también estén habilitadas para los formularios en la $formsSharedmatriz.

Si agrego otro ciclo for for $formsShared, así:

<?php foreach ($formsShared as $r): ?>
    $(#shareform<?=$r['Form']['id'];?>).hide();
    $(.Share<?=$r['Form']['id'];?>).click(function () {
        $(#shareform<?=$r['Form']['id'];?>).toggle(show);
    });//.Share click
<?php endforeach; ?>

Logro lo que quiero, pero parece ser una repetición del mismo código.

¿Hay alguna forma en CakePHP de recorrer dos matrices en un solo foreachbucle?

Solución: array_merge () solo acepta parámetros de tipo array. Por lo tanto, use typecasting para fusionar otros tipos.

  <?php foreach (array_merge((array)$Forms,(array)$formsShared) as $r): ?>

    $(#shareform<?=$r['Form']['id'];?>).hide();
     $(.Share<?=$r['Form']['id'];?>).click(function () {
        $(#shareform<?=$r['Form']['id'];?>).toggle(show);
    });//.Share click

  <?php endforeach;?>
Publicado el 24/07/2009 a las 06:45
fuente por usuario
En otros idiomas...                            


3 respuestas

votos
4

Parece que no quieres repetir dos listas al mismo tiempo . Desea recorrer dos listas por separado, ejecutando el mismo código para cada elemento en cualquiera de las listas. Entonces, ¿por qué no concatenar las listas?

foreach (array_merge($Forms, $FormsShared) as $r)
    // do stuff
Respondida el 24/07/2009 a las 06:58
fuente por usuario

votos
2

En lugar de repetir tanto JavaScript, puedes hacer uso de los selectores de jQuery . En lugar de usar classes únicos en los elementos de su formulario (o además de), use un nombre de clase genérico como form-field. Luego puede agregar un clickevento a todos ellos al mismo tiempo:

$('.form-field').click(function () {
    // Without knowing your HTML structure, I can't make this accurate, but maybe
    // this will work, assuming #shareform... is the parent <form> element:
    $(this).closest('form').toggle('show');
});

Este JavaScript solo necesitaría salir una vez y se aplicaría a todos los elementos con class="form-field". Tenga en cuenta que también puede tener múltiples clases en un elemento: class="Share123 form-field"le da clase Share123y clase de elementos form-field.

Respondida el 24/07/2009 a las 07:06
fuente por usuario

votos
1

Puedes hacer eso usando for () loop, aunque se ve bastante desagradable:

<?php

$arr1 = array('first 1', 'first 2', 'first 3');
$arr2 = array('second 1', 'second 2', 'second 3');

for($c1 = 0, $c2 = 0; $c1 < count($arr1), $c2 < count($arr2); $c1++, $c2++ )
{
    echo $arr1[$c1] . '<br />';
    echo $arr2[$c2] . '<br />';
}

?>

Eso es solo un ejemplo de PHP, pero sabes cómo editarlo;)

Editar:

Karl tiene razón, duplicar índices no es tan bueno, entonces otra solución, aunque tienes que usar @ para evitar advertencias:

<?php

$arr1 = array('first 1', 'first 2', 'first 3', 'first 4');
$arr2 = array('second 1', 'second 2', 'second 3');

for($c = 0; $c < max( count($arr1), count($arr2) ); $c++ )
{
    echo @$arr1[$c] . '<br />';
    echo @$arr2[$c] . '<br />';
}

?>
Respondida el 24/07/2009 a las 07:08
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more