/ / Deslocamento indefinido apesar da verificação array_key_exists () - php, matrizes, matriz-chave-existe

Deslocamento indefinido, apesar de array_key_exists () check - php, matrizes, array-key-exists

Ao usar o código abaixo em uma função ($floor E $lift são passados, mas eu os adicionei aqui para demonstração) estou recebendo um Notice: Undefined offset: 20 no último return declaração.

O último return é o meio que deve ser usado neste exemplo, mas por que estou recebendo o Notice: Undefined offset: 20? Se não me engano (o que claramente sou), o array_key_exists() função deve estar impedindo isso? Eu também tentei com isset() sem sucesso.

$floor = 20;
$lift = false;

$moving = array(
"no_lift" => array(
1 => 0,
2 => 13,
3 => 17,
4 => 20
),
"lift"    => array(
1 => 0,
2 => 10,
3 => 10,
4 => 20
)
);

switch ( $lift ) {
case true:
return ( isset( $moving["lift"][ $floor ] ) ? $moving["lift"][ $floor ] : $moving["lift"][ end( $moving["lift"] ) ] );
break;
case false:
return ( array_key_exists( $floor, $moving["no_lift"] ) ? $moving["no_lift"][ $floor ] : $moving["no_lift"][ end( $moving["no_lift"] ) ] );
break;
}

Respostas:

2 para resposta № 1

end retorna o último valor de uma matriz, então

$moving["lift"][ end( $moving["lift"] ) ]

e

$moving["no_lift"][ end( $moving["no_lift"] ) ]

ambos serão, com efeito,

$moving["no_lift"][ 20 ]

Se você pretende procurar algo na matriz e retornar o último item se ele não for encontrado, você pode usar in_array se você está procurando um valor

if ($lift) {
return in_array($floor, $moving["lift"]) ? $floor : end($moving["lift"]);
} else {
return in_array($floor, $moving["no_lift"]) ? $floor : end($moving["no_lift"]);
}

ou isset se você estiver procurando por uma chave.

if ($lift) {
return isset($floor, $moving["lift"]) ? $moving["lift"][$floor] : end($moving["lift"]);
} else {
return isset($floor, $moving["no_lift"]) ? $moving["no_lift"][$floor] : end($moving["no_lift"]);
}

Você pode usar array_key_exists ao invés de isset se alguns dos valores na matriz puderem ser null. (Você pode verificar as respostas Aqui para um pouco mais de uma descrição sobre isso.)


1 para resposta № 2

end não retorna o último chave, mas o último valor de uma matriz. Portanto, a linha deve ler:

return ( array_key_exists( $floor, $moving["no_lift"] ) ? $moving["no_lift"][ $floor ] : end( $moving["no_lift"] );

(No entanto, isso ainda pressupõe que $moving["no_lift"] é uma matriz.)