PHP: улучшение цикла, который использует foreach? - PullRequest
1 голос
/ 19 февраля 2012

Я использую foreach, чтобы зациклить массив ниже, а затем сделать номер заказа для хранения в базе данных,

$items_variable = array(
    'page_id',
    'page_content_1',
    'page_content_2',
    'page_content_3',
    'page_content_4',
    ...
);

Код только зацикливает 4 элемента из массивавыше (но что, если я увеличу эти page_content_# в будущем?)

foreach( $items_variable as $item_variable )
{   
    if (in_array($item_variable, array(
        'page_content_1',
        'page_content_2',
        'page_content_3',
        'page_content_4'
    )))
    {
        if($item_variable == 'page_content_1') $order_in_page = 1;
        if($item_variable == 'page_content_2') $order_in_page = 2;
        if($item_variable == 'page_content_3') $order_in_page = 3;
        if($item_variable == 'page_content_4') $order_in_page = 4;
        ....
        }
}

Текущий метод, который я описал выше, мне не очень нравится, особенно когда речь идет о такой строке,

if($item_variable == 'page_content_1') $order_in_page = 1;

Я добавлю больше таких строк, когда я увеличу page_content_# в будущем, и сценарий будет выглядеть довольно уродливо, я полагаю.

Что если у меня есть другой тип данныхномер заказа (например - code_1, code_2 и т. д.)?Затем я скопирую приведенный выше код и каждый раз меняю название предмета - это выглядит довольно мрачно, не правда ли!

Как мне сделать его лучше и динамичнее?

Ответы [ 6 ]

3 голосов
/ 19 февраля 2012

Ассоциативный массив

Вы можете сделать это:

$items_definitions = array(
    'page_content_1' => 1,
    'page_content_2' => 2,
    'page_content_3' => 3,
    'page_content_4' => 4,
    'page_content_5' => 5,
);

foreach( $items_variable as $item_variable ){ 
    if( isset( $items_definitions[ $item_variable])){
        $order_in_page = $items_definitions[ $item_variable];
    }
    ...
}

Динамически извлечь последнюю часть строки

Или сделать это полностью динамически, предполагая, что она всегда page_content_{$order_in_page},либо с regexp в качестве предложенного хаккартистом , либо с использованием "метода oldschool":

$prefix = 'page_content_';
foreach( $items_variable as $item_variable ){ 
    if( strncmp( $item_variable, $pregix, strlen( $prefix))){
        continue; // Assume that you don't want to do anything if it doesn't match
    }
    $page = intval( substr( $item_variable, strlen( $prefix)));
    if( !$page){
        continue;
    }
    $order_in_page = $page;
}

Я рекомендую изучить примеры из intval() документации:)

Switch оператор

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

foreach( $items_variable as $item_variable ){
    switch( $item_variable){
        case 'page_content_1':
            $order_in_page = 1;
            break;
        case 'page_content_2':
            $order_in_page = 2;
            break;
        case 'page_content_3':
            $order_in_page = 3;
            break;
        ...
        default:
    }
}

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

2 голосов
/ 19 февраля 2012

точно не знаю, что вы хотите, но попробуйте это вместо оператора if:

preg_match('/page_content_([0-9]+)/',$item_variable,$matches);
$order_in_page = $matches[1];
1 голос
/ 19 февраля 2012
foreach($items_variable as $item_variable) {   
    preg_match('/[0-9]*$/',$item_variable , $suffix);
    $suffix = $suffix[0];
    if ($suffix !== '') {
        # code 1
    } else {
        # code 2
    }
}
1 голос
/ 19 февраля 2012

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

$order_in_page = array(
    'page_content_1' => 1,
    'page_content_2' => 2,
    'page_content_3' => 3,
    'page_content_4' => 4,
    'someotherpage' => 5,
    'yet_another_page' => 6
);


$o = $order_in_page[$item_variable];

Материал по структуре данных http://en.wikipedia.org/wiki/Associative_array

PHP Документация http://php.net/manual/de/language.types.array.php

1 голос
/ 19 февраля 2012

Ваш текущий массив, если вы записываете его с явными ключами, выглядит следующим образом:

$items_variable = array(
    0 => 'page_id',
    1 => 'page_content_1',
    2 => 'page_content_2',
    3 => 'page_content_3',
    4 => 'page_content_4',
    ...
);

Обратите внимание, что номер ключа полностью совпадает с номером содержимого страницы. Таким образом, вы можете изменить цикл foreach следующим образом:

foreach( $items_variable as $order_in_page => $item_variable )

Теперь $order_in_page должен храниться с номером ключа, который в вашем массиве напрямую связан с номером содержимого страницы. Возможно, вам понадобится преобразовать его в int, хотя я не уверен в этом факте:

$order_in_page = (int) $order_in_page;

Если вместо этого ваш массив выглядел следующим образом (без элемента 'page_id'):

$items_variable = array(
    0 => 'page_content_1',
    1 => 'page_content_2',
    2 => 'page_content_3',
    3 => 'page_content_4',
    ...
);

Сделайте то же самое, что и выше, но добавьте одно к результату:

++$order_in_page;

Если требуется литье, кастуйте до приращения.

0 голосов
/ 19 февраля 2012

Я не уверен, что понял ваш вопрос, но вы, возможно, захотите сохранить ваши данные в многомерном массиве, например:

$items_variable = array(
    'page_id',
    'content' => array(
        //content
    )
);

Тогда вы можете просто перебрать каждый массив содержимого, например:

foreach($items_variable['content'] as $content) {
    //do stuff with the content
}

Нет необходимости в регулярных выражениях или других вещах.

...