Подтвердить что ты не робот

PHP: Получить n-й элемент ассоциативного массива

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

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

Но он просто создает пустую запись.

4b9b3361

Ответ 1

Использовать 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];

Ответ 2

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

$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 не установлено. Вышеприведенный код делает это. Однако вместо повторения через внутренний массив он выполняет итерацию через внешний массив и использует индекс для отслеживания, где он находится во внутреннем массиве. Это должно быть достаточно эффективным.

Ответ 3

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

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

$second= array_slice($a, 1, 1, true);
var_dump($second);

Ответ 4

Здесь один способ сделать это с помощью array_slice и current

$value = current(array_slice($array, 1, 1)); // returns value only

Ответ 5

Если массив, который вы предоставили в первом примере, соответствует $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++;
}

Ответ 6

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

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

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
    }
}

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

Ответ 7

/**
         * Get nth item from an associative array
         * 
         * 
         * @param     $arr
         * @param int $nth
         *
         * @return array
         */
        function getNthItemFromArr($arr, $nth = 0){
            $nth = intval($nth);
            if(is_array($arr) && sizeof($arr) > 0 && $nth > 0){
                $arr = array_slice($arr,$nth-1, 1, true);
            }
            return $arr;
        }//end function getNthItemFromArr