It depends on whether you have respawn and/or whether you have ai disabled. Obviously, you understand the situation with respawn/JIP turned off.
If AI are enabled, then P1 (as stored in the array) will be fine if someone leaves and the same, or another, person joins, since the actual soldier object will be carried through. If you or the AI respawns in this situation, then the PlayerList elements will point towards the first corpse and won't point at the current incarnation. Thus, you'd want to create the array as and when you needed it, so you got the latest value of P1 (or just use a call compile format to just get the value of "P%1", unless you want to iterate through the entire array).
If AI are disabled, then when the player disconnects, then the soldier object is destroyed and when someone connects, it is recreated (so will not be the same). So, on JIP or respawn, as described above, you have to get the current value of P1, not the value it was at the start of the mission, which is what would be recorded in PlayerList if it was set up in your init.sqf.
If you put a killed handler on someone, you can tell when they respawn (assumes that they are respawning players or AI using player bodies, and that they have a name set in the editor):
// Put in player soldier init:
// nul = [this] execVM "respawn_event.sqf"
private ["_player"];
_player = _this select 0;
_player addEventHandler ["KILLED", {
_corpse = _this select 0;
_name = vehicleVarName _corpse;
[_name] spawn
{
_name = _this select 0;
_getObject = compile _name;
waitUntil { alive (call _getObject) };
(call _getObject) sideChat "I respawned!";
};
}];