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 项的主要内容,如果未能解决你的问题,请参考以下文章