2010-01-04 90 views
38

的第n個項如果你有一個關聯數組:PHP:獲取一個關聯數組

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

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

而且你要訪問的第二個項目,你會怎麼做呢? $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 

,但它只是產生一個空白項。

+0

來做到這一點是有可能改變的鑰匙,set_later是字段名稱?所以$ form_state ['values'] ['set_later'] = array('uid'=> 1,'status'=> 0)?這將解決問題,並刪除array_search的需要。 – Kevin 2010-01-04 05:34:38

回答

47

使用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]; 
+0

設置array_slice()的perserve_keys參數似乎對我沒有任何影響:http://sandbox.onlinephpfunctions.com/code/05e880de8805ff45f652743e1a309f598fac245f - 而不是返回一個鍵控數組,我希望能夠訪問像這樣的值$ blah [0](如上例)。相反,我仍然需要通過其關鍵而不是位置來查找我所追求的價值。 – jonathanbell 2014-09-16 20:14:40

+0

對於我的應用程序,我需要查找第n個項目並將其刪除,並最終意識到'array_splice'(而不是'array_slice')同時做到了! – thomasrutter 2016-02-25 01:34:19

+0

最後一個選項似乎沒有像描述的那樣工作。查看[docs](http://php.net/manual/en/function.array-slice.php),他們聲明* preserve_keys:注意,array_slice()默認會重新排序和重置數字數組索引。您可以通過將preserve_keys設置爲TRUE來改變這種行爲。*這意味着最後一個選項會導致'array(「status」=> 1)' – DelightedD0D 2016-12-09 03:53:50

5

您可以使用array_slice獲得第二項:

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

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

如果你在第一個例子提供陣列對應於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++; 
} 
13

我有點困惑。您的代碼似乎沒有正確的數組的鍵。但是,如果你想抓住只是一個數組的第二個元素,你可以使用:

$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值沒有設置。上面的代碼是這樣做的。但是,它不是遍歷內部數組,而是遍歷外部數組,並使用索引來追蹤它在內部數組中的位置。這應該是合理的表現。

0

這裏的每個響應都集中在獲取第二個元素,而不依賴於數組的形成方式。

如果這是你的情況。

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

這裏有一個行的方式與array_slicecurrent

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