PHP:获取关联数组的第 n 项

Posted

技术标签:

【中文标题】PHP:获取关联数组的第 n 项【英文标题】:PHP: Get n-th item of an associative array 【发布时间】:2011-01-01 03:27:18 【问题描述】:

如果你有一个关联数组:

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 的需求。 【参考方案1】:

您可以使用array_slice获取第二项:

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

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

【讨论】:

【参考方案2】:

使用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() 的 perserve_keys 参数似乎对我没有影响:sandbox.onlinephpfunctions.com/code/… -- 我希望能够访问 $blah[ 之类的值,而不是返回键控数组0](如上例所示)。相反,我仍然需要通过键而不是位置来查找我所追求的值。 对于我的应用程序,我需要同时查找第 n 个项目并将其删除,并最终意识到 array_splice(而不是 array_slice)两者兼而有之! 最后一个选项似乎不像描述的那样工作。查看docs,他们声明 preserve_keys:请注意,array_slice() 默认情况下会重新排序和重置数字数组索引。您可以通过将 preserve_keys 设置为 TRUE 来更改此行为。 这意味着最后一个选项会导致 array("status" => 1) @nickf:与上述其他 cmets 中的问题相同,在您的最后一个示例中,最后一个参数必须是 false 以告诉 php not 保留密钥。在您的第一个示例中,您必须添加最后一个参数 true 以使用此保留的“状态”键获得结果(因为没有参数 = 默认 = 假 = 重新索引为 0)【参考方案3】:

如果您在第一个示例中提供的数组对应于 $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++;

【讨论】:

【参考方案4】:

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

$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
(
    [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
    

我不明白你想做什么,想解释一下吗?

【讨论】:

【参考方案6】:

这是使用array_slice 和current 的一种方法

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

【讨论】:

【参考方案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

【讨论】:

以上是关于PHP:获取关联数组的第 n 项的主要内容,如果未能解决你的问题,请参考以下文章

PHP 获取关联数组的第一个键

php - 如何在关联数组的数组中搜索多个键/值对并返回匹配项?

如果两个值匹配,则从 php 中的多维关联数组中删除重复项

获取关联数组的第一个值

获取关联数组的第一个键

匹配数组项值并将新值分配给关联数组