Question

Je suis en train de faire quelque chose, mais je ne peux pas trouver une solution, je suis aussi un peu de difficulté mettre en œuvres alors voici un exemple de code, peut-être que ce sera suffisant pour démontrer ce que je vise pour:

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

Maintenant, je veux utiliser array_splice() pour enlever (et retour) un élément de la matrice:

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

Ce qui précède va enlever et retourner 1 élément (troisième argument) de $input (premier argument), à décalage 2 (deuxième argument), de sorte que $spliced contiendra la valeur more .

Je vais être itérer sur $input avec une boucle foreach, je sais que la clé soit épissé mais le problème est que je ne sais pas son décalage numérique et puisque array_splice accepte uniquement des nombres entiers Je ne sais pas quoi faire.

Un exemple très terne:

$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));
    }
}

J'ai d'abord que d'utiliser array_search() mais il est inutile car elle « ll retourne l'index associatif ....

Comment puis-je déterminer la position numérique d'un indice associatif?

Était-ce utile?

La solution

Juste saisir et unsetting la valeur est une approche beaucoup mieux (et probablement plus rapide aussi) , mais de toute façon, vous pouvez juste compter sur

$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);

donne

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

et Sur le plan technique une clé associative n'a pas d'index numérique. Si le tableau d'entrée est

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

puis l'indice 2 est "baz". Mais depuis array_slice accepte une Impression offset , ce qui est identique à une clé numérique, il utilise l'élément trouvé à cette position dans le tableau (pour les éléments apparaissent), ce qui explique pourquoi le comptage le long des travaux.

Sur un Sidenote, avec les touches numériques du tableau, vous obtiendrez des résultats drôles, parce que vous testez pour l'égalité au lieu de l'identité. Faites-$key === 'more' au lieu d'éviter « plus » se typecasted. Comme les clés associatives sont uniques, vous pouvez également revenir après « plus » a été trouvé, car la vérification des clés suivantes est inutile. Mais vraiment:

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

Autres conseils

J'ai trouvé la solution:

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

Même avec des tableaux "drôles", tels que:

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

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

Sorties correctement ceci:

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

Il est une solution triviale, mais un peu obscur pour y arriver.

Je vous remercie de toute l'aide de tout le monde. =)

$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++;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top