Добавление в массив, где ключ равен переменной - PullRequest
2 голосов
/ 12 июля 2011

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

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 ]

1 голос
/ 12 июля 2011

Если я правильно понимаю ваш вопрос, проблема в том, что вы пытаетесь добавить элемент массива в $ 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;
0 голосов
/ 12 июля 2011

Я бы изменил ваш ключ массива $ 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;
}
0 голосов
/ 12 июля 2011

Вы заблокированы в использовании массива для хранения $ items?Если это так, вы застрянете, выполняя вложенный цикл («Для каждого элемента в $ this-> progress, проверьте каждый элемент в $ items. Если соответствует, обновите $ items» или что-то в этом роде).Если у вас есть некоторая гибкость, я бы использовал хеш для $ items (ассоциативный массив в php-говорить), где индекс - это имя шага.Поэтому $ items ['Setup'] будет содержать 'url' => ... и 'status' => ... и т. Д. Имеет ли это смысл?Затем ваш алгоритм разбивается на «Для каждого элемента в $ this-> progress, получите элемент в $ items по имени ($ items [$ step_name]) и обновите его информацию».

...