PHP: Получите энный объект ассоциативного массива

Если у Вас есть ассоциативный массив:

Array
(
    [uid] => Marvelous
    [status] => 1
    [set_later] => Array
        (
            [0] => 1
            [1] => 0
        )

    [op] => Submit
    [submit] => Submit
)

И Вы хотите получить доступ к 2-му объекту, как Вы сделали бы это? $arr[1] кажется, не работает:

foreach ($form_state['values']['set_later'] as $fieldKey => $setLater) {
    if (! $setLater) {
        $valueForAll = $form_state['values'][$fieldKey];
        $_SESSION[SET_NOW_KEY][array_search($valueForAll, $form_state['values'])] = $valueForAll; // this isn't getting the value properly
    }
}

Этот код, как предполагается, производит:

$_SESSION[SET_NOW_KEY]['status'] = 1

Но это просто производит пустую запись.

48
задан Nick Heiner 4 January 2010 в 05:40
поделиться

5 ответов

Использовать array_slice

$second = array_slice($array, 1, 1, true);  // array("status" => 1)

// or

list($value) = array_slice($array, 1, 1); // 1

// or

$blah = array_slice($array, 1, 1); // array(0 => 1)
$value = $blah[0];
64
ответ дан 26 November 2019 в 18:48
поделиться

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

$keys = array_keys($inArray);
$key = $keys[1];
$value = $inArray[$key];

Однако, после рассмотрения того, что вы пытаетесь сделать, что-то вроде этого может сработать лучше:

$ii = 0;
$setLaterArr = $form_state['values']['set_later'];
foreach($form_state['values'] as $key => $value) {
    if($key == 'set_later')
        continue;
    $setLater = $setLaterArr[$ii];
    if(! $setLater) {
        $_SESSION[SET_NOW_KEY][$key] = $value;
    }
    $ii ++;
}

Помогает ли это? Похоже, что Вы пытаетесь установить значение сессии, если значение set_later не установлено. Приведенный выше код делает это. Однако, вместо итерации через внутренний массив, он выполняет итерацию через внешний массив и использует индекс для отслеживания места, где он находится во внутреннем массиве. Это должно быть разумно эффективно.

.
16
ответ дан 26 November 2019 в 18:48
поделиться

Вы можете использовать array_slice , чтобы получить второй пункт:

$a= array(
 'hello'=> 'world',
 'how'=> 'are you',
 'an'=> 'array',
);

$second= array_slice($a, 1, 1, true);
var_dump($second);
5
ответ дан 26 November 2019 в 18:48
поделиться

Если предоставленный в первом примере массив соответствует $form_state, то

$form_state['values']['set_later'][1]

будет работать.

Иначе

$i = 0;
foreach ($form_state['values']['set_later'] as $fieldKey => $setLater) {
    if ($i == 1) {
        $valueForAll = $form_state['values'][$fieldKey];
        $_SESSION[SET_NOW_KEY][$fieldKey] = $setLater;
        continue;
    }
    $i++;
}
0
ответ дан 26 November 2019 в 18:48
поделиться

Здесь каждый из ответов сфокусирован на получении второго элемента, независимо от того, как массив формируется.

Если это ваш случай.

Array
(
    [uid] => Marvelous
    [status] => 1
    [set_later] => Array
        (
            [0] => 1
            [1] => 0
        )

    [op] => Submit
    [submit] => Submit
)

Тогда вы можете получить значение второго элемента через $array['status'].

Также этот код

foreach ($form_state['values']['set_later'] as $fieldKey => $setLater) {
    if (! $setLater) {
        $valueForAll = $form_state['values'][$fieldKey];
        $_SESSION[SET_NOW_KEY][array_search($valueForAll, $form_state['values'])] = $valueForAll; // this isn't getting the value properly
    }
}

Я не понимаю, что вы пытаетесь сделать, хотите объяснить?

.
0
ответ дан 26 November 2019 в 18:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: