array_splice() - 关联数组的数值偏移量

时间:2010-05-08 23:07:52

标签: php arrays associative-array array-splice

我正在尝试做一些事情,但我找不到任何解决方案,我也遇到了一些麻烦,所以这里有一个示例代码,也许它足以证明我的目标是什么为:

$input = array
(
    'who' => 'me',
    'what' => 'car',
    'more' => 'car',
    'when' => 'today',
);

现在,我想使用array_splice()从数组中删除(并返回)一个元素:

$spliced = key(array_splice($input, 2, 1)); // I'm only interested in the key...

以上将从$input(第一个参数)中移除并返回1个元素(第三个参数),偏移量为2(第二个参数),因此$spliced将保存值 {{1 }}

我将使用foreach循环迭代more,我知道要拼接的关键但问题是我不知道它的数字偏移以及{{1只接受我不知道该怎么做的整数。

一个非常沉闷的例子:

$input

我首先使用array_search(),但它没有意义,因为它会返回关联索引....

如何确定关联索引的数字偏移?

3 个答案:

答案 0 :(得分:4)

抓住并unset这个值是一个更好的方法(也可能更快),但无论如何,你可以算上

$result = array();
$idx = 0; // init offset
foreach ($input as $key => $value)
{
    if ($key == 'more')
    {
        // Remove the index "more" from $input and add it to $result.
        $result[] = key(array_splice($input, $idx, 1));
    }
    $idx++; // count offset
}
print_R($result);
print_R($input);

给出

Array
(
    [0] => more
)
Array
(
    [who] => me
    [what] => car
    [when] => today
)

但是从技术上讲,关联键没有数字索引。如果输入数组是

$input = array
(
    'who' => 'me',
    'what' => 'car',
    'more' => 'car',
    'when' => 'today',
    'foo', 'bar', 'baz'
);

然后索引2是“baz”。但由于array_slice接受 offset ,它与数字键不同,它使用在数组中该位置找到的元素(按元素显示的顺序),这就是为什么沿着工作计数。

在旁注中,使用数组中的数字键,您会得到有趣的结果,因为您正在测试相等而不是身份。改为$key === 'more',以防止'更多'进行类型转换。由于关联键是唯一的,你也可以在找到'more'后返回,因为检查后续键是没有意义的。但是真的:

if(array_key_exists('more', $input)) unset($input['more']);

答案 1 :(得分:3)

我找到了解决方案:

$offset = array_search('more', array_keys($input)); // 2

即使使用“搞笑”数组,例如:

$input = array
(
    'who' => 'me',
    'what' => 'car',
    'more' => 'car',
    'when' => 'today',
    'foo', 'bar', 'baz'
);

此:

echo '<pre>';
print_r(array_keys($input));
echo '</pre>';

正确输出:

Array
(
    [0] => who
    [1] => what
    [2] => more
    [3] => when
    [4] => 0
    [5] => 1
    [6] => 2
)

这是一个微不足道的解决方案,但到达那里有点模糊。

我感谢所有人的帮助。 =)

答案 2 :(得分:1)

$i = 0;
foreach ($input as $key => $value)
{
    if ($key == 'more')
    {
        // Remove the index "more" from $input and add it to $result.
        $result[] = key(array_splice($input, $i , 1));

    }
    $i++;
}