2010-01-04 87 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