В основном интерпретатор оценивает это выражение слева направо, поэтому:
echo $test == 'one' ? 'one' : $test == 'two' ? 'two' : 'three';
интерпретируется как
echo ($test == 'one' ? 'one' : $test == 'two') ? 'two' : 'three';
И выражение в паратезах оценивается как истинное, поскольку и «один», и «два» не являются нулевой / о / другой формой ложного.
Так что если бы это выглядело так:
echo $test == 'one' ? FALSE : $test == 'two' ? 'two' : 'three';
Это напечатало бы три. Чтобы все работало нормально, вы должны забыть о комбинировании троичных операторов и использовать обычные ifs / switch для более сложной логики или, по крайней мере, использовать скобки, чтобы интерпретатор понимал вашу логику, а не выполнять проверку стандартным способом LTR:
echo $test == 'one' ? 'one' : ($test == 'two' ? 'two' : ($test == 'three' ? 'three' : 'four'));
//etc... It's not the most understandable code...
//You better use:
if($test == 'one')
echo 'one';
else { //or elseif()
...
}
//Or:
switch($test) {
case 'one':
echo 'one';
break;
case 'two':
echo 'two';
break;
//and so on...
}