添加到Key等于Variable的数组

时间:2011-07-12 17:00:38

标签: php multidimensional-array foreach

我总是很难绕过这些foreach数组的东西,而且这对我来说是一个令人难以置信的价值资源,所以我希望你们能帮助解决这个问题。

public function progress_bar()
{

    $items = array(
        array(
            'step-name' => 'Setup',
            'url' => '/projects/new/setup/',
        ),
        array(
            'step-name' => 'Artwork',
            'url' => '/projects/new/artwork/',
        ),
        array(
            'step-name' => 'Review',
            'url' => '/projects/new/review/',
        ),
        array(
            'step-name' => 'Shipping',
            'url' => '/projects/new/shipping-info/',
        ),
        array(
            'step-name' => 'Billing',
            'url' => '/projects/new/billing/',
        ),
        array(
            'step-name' => 'Receipt',
            'url' => '/projects/new/receipt/',
        ),
    );

    // Status can be active, editing, or complete.

    foreach ($this->progress as $step => $status)
    {
        foreach ($items as $item)
        {
            $item['step-name'] == ucfirst($step) ? $item['status'] = $status : '';
        }
    }

    return $items;
}

$this->progress包含一系列状态('setup' => 'active', 'artwork' => 'editing')

我想在$items

中添加$this->progress数组中每个匹配项的状态
$items = array(
    array(
        'step-name' => 'Setup',
        'url' => '/projects/new/setup',
        'status' => 'active',
    ),
    etc...
);

3 个答案:

答案 0 :(得分:1)

如果我正确理解你的问题,问题是你正在尝试向$ items添加一个数组元素,但你实际做的是将元素添加到一个临时变量($ item),它不引用原始的$ items变量。

我建议像这样接近它:

foreach ($this->progress as $step => $status)
{
    // Having the $key here allows us to reference the
    // original $items variable.
    foreach ($items as $key => $item)
    {
        if ($item['step-name'] == ucfirst($step) )
        {
            $items[$key]['status'] = $status;
        }
    }
}

return $items;

答案 1 :(得分:0)

您是否已锁定使用数组存储$ items?如果是这样,那么你将陷入一个嵌套循环(“对于$ this->进程中的每个元素,检查$ items中的每个元素。如果匹配,则更新$ items”或类似的东西)。如果你有一些灵活性,我会使用$ items的哈希值(php-speak中的关联数组),其中索引是步骤名称。所以$ items ['Setup']将包含'url'=> ......和'status'=> ......等有意义吗?然后你的算法分解为“对于$ this->进度中的每个元素,按名称获取$ items中的元素($ items [$ step_name])并更新它的信息。”

答案 2 :(得分:0)

我会改变你对$ items数组进行键控的方式,并按照这样做。阻止你拥有嵌套循环。

public function progress_bar()
{

    $items = array(
        'Setup' => array(
                'url' => '/projects/new/setup/',
               ),
        'Artwork' => array(
                    'url' => '/projects/new/artwork/',
                ),
        'Review' => array(
                    'url' => '/projects/new/review/',
                ),
        'Shipping' => array(
                    'url' => '/projects/new/shipping-info/',
                ),
        'Billing' => array(
                    'url' => '/projects/new/billing/',
                ),
        'Receipt' => array(
                    'url' => '/projects/new/receipt/',
                )
    );

    // Status can be active, editing, or complete.

    foreach ($this->progress as $step => $status)
    {
        $item[ucfirst($step)]['status'] = $status;
    }

    return $items;
}