Если заявление с 2 условиями


На мою форму, есть два вида адрес-полей пользователь может дать. Но так как это сложные формы (Друпал) это сложно достичь. Каждый раз, когда пользователь добавляет дополнительный адрес, форма регенерируется и будет новый элемент, добавленный к $address_afl и $address_bev-массив. Можно ли сжать этот код, чтобы командлет foreach-цикл начинается цикл с наибольшим значением (либо $address_afl или$address_bev )

$address_afl = $form['field_afl_dienst_adressen']['und'];
$i = 0;
foreach($address_afl as $value) {
    if (is_array($value)) {
        $test = array_keys($value);
    if(is_array($test)) {
        foreach ($test as $z) {
            if (strpos($z, '#') === 0) continue;
            if (isset($form['field_afl_dienst_adressen']['und'][$i][$z])) {
                $form['field_afl_dienst_adressen']['und'][$i][$z]['#prefix'] = "<div class='address-publicatie-$z'>";
                $form['field_afl_dienst_adressen']['und'][$i][$z]['#suffix'] = "</div>";
            }
        }
    }
    }
    $i++;
}

$address_bev = $form['field_bevoegde_adressen']['und'];
$i = 0;
foreach($address_bev as $value) {
    if (is_array($value)) {
        $test = array_keys($value);
    if(is_array($test)) {
        foreach ($test as $z) {
            if (strpos($z, '#') === 0) continue;
            if (isset($form['field_afl_dienst_adressen']['und'][$i][$z])) {
                $form['field_bevoegde_adressen']['und'][$i][$z]['#prefix'] = "<div class='address-publicatie-$z'>";
                $form['field_bevoegde_adressen']['und'][$i][$z]['#suffix'] = "</div>";
            }
        }
    }
    }
    $i++;
}


327
4
php
задан 20 декабря 2011 в 07:12 Источник Поделиться
Комментарии
2 ответа

Я не совсем точно понимаю логику, но вы можете извлечь по крайней мере один метод, который удаляет много дублирования кода. Я перевернутый некоторые условия (что улучшает читабельность кода) и тоже поместить некоторые комментарии в коде.

function processValue(&$form, $value, $i, &$form_sub) {
if (!is_array($value)) {
return;
}

// TODO: rename test to $keys or something more meaningful
$test = array_keys($value);
if (!is_array($test)) {
// TODO: is it possible? according to the documentation
// array_keys() always returns array
return;
}
foreach ($test as $z) {
if (strpos($z, '#') === 0) {
continue;
}
if (!isset($form['field_afl_dienst_adressen']['und'][$i][$z])) {
continue;
}
$form_sub[$i][$z]['#prefix'] = "<div class='address-publicatie-$z'>";
$form_sub[$i][$z]['#suffix'] = "</div>";
}
}

$address_afl = $form['field_afl_dienst_adressen']['und'];
$i = 0;
foreach($address_afl as $value) {
processValue($form, $value, $i, $form['field_afl_dienst_adressen']['und']);
$i++;
}

$address_bev = $form['field_bevoegde_adressen']['und'];
$i = 0;
foreach($address_bev as $value) {
processValue($form, $value, $i, $form['field_bevoegde_adressen']);
$i++;
}


Возможные ошибки: и по каждому элементу имеет следующее состояние с такими же $форма индекса:

if (isset($form['field_afl_dienst_adressen']['und'][$i][$z])) ...

Может быть, вы хотите изменить второе

if (isset($form['field_bevoegde_adressen']['und'][$i][$z])) ...

Это позволит некоторые другие рефакторинга (меньшее число параметров и т. д.), как Виктор Тимофеевич предложил.

2
ответ дан 21 декабря 2011 в 09:12 Источник Поделиться

Вы должны быть в состоянии учитывать все эти повторы в 2 вызовов функций.

Я думаю, что palacsint это наблюдение верно, что $тест - это всегда массив здесь. На самом деле, я не уверен, я понимаю, почему вы не просто использовать клавиши в значение$ напрямую. Не появляются ключи переодеться в петле.

if (is_array($value)) {
$test = array_keys($value);
if(is_array($test)) {
foreach ($test as $z) {

Этот рефакторинг подобное предложение palacsint, но и пойти дальше.

function name_needed(&$addr_src)
{
$i = -1;
foreach($addr_src as $next)
{
++$i;
if (!is_array($next)) continue;

foreach($next as $z => $_)
{
if (strpos($z, '#') === 0 || !isset($addr_src[$i][$z])) continue;

$addr_src[$i][$z]['#prefix'] = "<div class='address-publicatie-$z'>";
$addr_src[$i][$z]['#suffix'] = "</div>";
}
}
}

name_needed($form['field_afl_adressen']['und']);
name_needed($form['field_bevoegde_adressen']['und']);

1
ответ дан 22 декабря 2011 в 02:12 Источник Поделиться