PHP:获取关联数组中第n个元素

56
如果您有一个关联数组:
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

但它只会产生一个空白条目。

能否将set_later中的键更改为字段名称,以便$form_state['values']['set_later'] = array( 'uid' => 1, 'status' => 0 )?这将解决问题并消除对array_search的需求。 - Kevin
7个回答

76

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

设置array_slice()的preserve_keys参数对我似乎没有影响:http://sandbox.onlinephpfunctions.com/code/05e880de8805ff45f652743e1a309f598fac245f -- 我希望能够像$blah [0]一样访问值,而不是返回一个键控数组(如上例)。相反,我仍然必须通过其键而不是位置查找我想要的值。 - jonathanbell
为了我的应用程序,我需要查找第n个项目并将其删除,最终发现array_splice(而不是array_slice)两者都可以实现! - thomasrutter
最后一个选项似乎不像描述的那样有效。查看文档,它们指出preserve_keys:请注意,array_slice()默认情况下会重新排序和重置数字数组索引。您可以通过将preserve_keys设置为TRUE来更改此行为。这意味着最后一个选项的结果是array("status" => 1) - Wesley Smith
@nickf:和上面其他评论一样的问题,在你的最后一个例子中,最后一个参数必须是“false”,告诉php_不要_保留键。在你的第一个例子中,你必须添加一个最后一个参数“true”,以获取这个被保留的“status”键的结果(因为没有参数=默认= false =重新索引为0)。 - fpierrat

17

我有点困惑。你的代码似乎没有正确获取数组的键。不过,如果你只想获取数组中的第二个元素,可以使用以下代码:

$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的值未设置。上面的代码实现了这一点。然而,它没有遍历内部数组,而是遍历外部数组并使用索引跟踪内部数组中的位置。这应该是相当高效的。


5
您可以使用 array_slice 方法来获取第二个元素:
$a= array(
 'hello'=> 'world',
 'how'=> 'are you',
 'an'=> 'array',
);

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

4

使用 array_slicecurrent 可以一行代码实现。

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

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

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
/**
         * 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接