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 

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

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

 $second = array_slice($array, 1, 1); // array("status" => 1) // or list($value) = array_slice($array, 1, 1); // 1 // or $blah = array_slice($array, 1, 1, true); // array(0 => 1) $value = $blah[0]; 

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

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

Вы можете использовать array_slice для получения второго элемента:

 $a= array( 'hello'=> 'world', 'how'=> 'are you', 'an'=> 'array', ); $second= array_slice($a, 1, 1, true); var_dump($second); 

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

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

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

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

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

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

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