1

私は何かをしようとしていますが、解決策が見つかりません。また、それを機能させるのに問題があるので、ここにサンプルコードがあります。おそらく、私が目指していることを示すのに十分でしょう。

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

array_splice()ここで、配列から1つの要素を削除(および返す)するために使用したいと思います。

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

上記は$input、オフセット2(2番目の引数)で(最初の引数)から1つの要素(3番目の引数)を削除して返す$splicedため、値を保持しますmore

$inputforeachループを繰り返し処理します。スプライスするキーはわかっていますが、問題は、その数値オフセットがわからないことと、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'に、「more」がタイプキャストされないようにします。連想キーは一意であるため、後続のキーをチェックすることは無意味であるため、「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 に答える