PHP:改进使用foreach的循环?

时间:2012-02-18 23:54:33

标签: php for-loop foreach php-5.3

我使用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_1code_2等)怎么办?然后我复制上面的代码并每次更改项目名称 - 这看起来很阴沉不是!

如何让它变得更好动态?

6 个答案:

答案 0 :(得分:3)

关联数组

你可以这样做:

$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 hackartist或者使用“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:
    }
}

但是,只有当前两个选项无法解决时,我才会这样做(例如,你需要为每个案例调用不同的函数)。

答案 1 :(得分:2)

不确定你想要什么,但尝试这个而不是if语句:

preg_match('/page_content_([0-9]+)/',$item_variable,$matches);
$order_in_page = $matches[1];

答案 2 :(得分:1)

如果使用显式键将其写出,则当前数组如下所示:

$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;

如果需要施法,则在增量之前施放。

答案 3 :(得分:1)

我不确定我理解你的问题,但是关联数组可能是你的解决方案。您可以使用它将字符串与值匹配:

$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

答案 4 :(得分:1)

foreach($items_variable as $item_variable) {   
    preg_match('/[0-9]*$/',$item_variable , $suffix);
    $suffix = $suffix[0];
    if ($suffix !== '') {
        # code 1
    } else {
        # code 2
    }
}

答案 5 :(得分:0)

我不确定我是否理解您的问题,但您可能希望将数据存储在多维数组中,例如:

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

然后你可以遍历每个内容数组,例如:

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

不需要正则表达式或其他东西。