1

我正在尝试做某事,但找不到任何解决方案,我在将其投入使用时也遇到了一些麻烦,所以这是一个示例代码,也许足以证明我的目标是:

$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(第一个参数)在偏移量 2(第二个参数)处删除并返回 1 个元素(第三个参数),因此$spliced将保留 value more

我将使用 foreach 循环进行迭代$input,我知道要拼接的键,但问题是我不知道它的数字偏移量,因为array_splice只接受整数我不知道该怎么做。

一个非常无聊的例子:

$result = array();

foreach ($input as $key => $value)
{
    if ($key == 'more')
    {
        // Remove the index "more" from $input and add it to $result.
        $result[] = key(array_splice($input, 2 /* How do I know its 2? */, 1));
    }
}

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

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

4

3 回答 3

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接受一个与数字键不同的偏移量,它使用在数组中该位置找到的元素(按照元素出现的顺序),这就是为什么沿着计数起作用的原因。

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

if(array_key_exists('more', $input)) unset($input['more']);
于 2010-05-08T23:21:12.727 回答
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
)

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

我感谢大家的帮助。=)

于 2010-05-08T23:39:46.630 回答
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++;
}
于 2010-05-08T23:27:28.983 回答