web-dev-qa-db-fra.com

PHP: Obtenir le n-ième élément d'un tableau associatif

Si vous avez un tableau associatif:

Array
(
    [uid] => Marvelous
    [status] => 1
    [set_later] => Array
        (
            [0] => 1
            [1] => 0
        )

    [op] => Submit
    [submit] => Submit
)

Et vous voulez accéder au deuxième élément, comment le feriez-vous? $arr[1] ne semble pas fonctionner:

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
    }
}

Ce code est censé produire:

$_SESSION[SET_NOW_KEY]['status'] = 1

Mais cela produit simplement une entrée vide.

44
Nick Heiner

Utilisez 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];
59
nickf

Je suis un peu confus. Votre code ne semble pas avoir les clés correctes pour le tableau. Cependant, si vous souhaitez ne saisir que le deuxième élément d'un tableau, vous pouvez utiliser:

$keys = array_keys($inArray);
$key = $keys[1];
$value = $inArray[$key];

Cependant, après avoir envisagé ce que vous essayez de faire, cela pourrait mieux fonctionner:

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

Est ce que ça aide? Il semble que vous tentiez de définir la valeur de la session si la valeur set_later n'est pas définie. Le code ci-dessus fait cela. Au lieu de parcourir le tableau interne, toutefois, il effectue une itération sur le tableau externe et utilise un index pour rechercher sa position dans le tableau interne. Cela devrait être raisonnablement performant.

14
Perry Munger

Vous pouvez utiliser array_slice pour obtenir le deuxième élément:

$a= array(
 'hello'=> 'world',
 'how'=> 'are you',
 'an'=> 'array',
);

$second= array_slice($a, 1, 1, true);
var_dump($second);
5
leepowers

Voici un moyen de le faire avec array_slice et current

$value = current(array_slice($array, 1, 1)); // returns value only
2
Sam Carlton

Chacune des réponses ici vise à obtenir le deuxième élément, indépendamment de la façon dont le tableau est formé.

Si c'est votre cas.

Array
(
    [uid] => Marvelous
    [status] => 1
    [set_later] => Array
        (
            [0] => 1
            [1] => 0
        )

    [op] => Submit
    [submit] => Submit
)

Ensuite, vous pouvez obtenir la valeur du deuxième élément via $array['status'].

Aussi ce code

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
    }
}

Je ne comprends pas ce que tu essaies de faire, tu veux expliquer?

0
metrobalderas

Si le tableau que vous fournissez dans le premier exemple correspond à $ form_state, alors

$form_state['values']['set_later'][1]

marchera.

Autrement

$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++;
}
0
Elise van Looij
/**
         * 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
0
Manchumahara