Meine Herren!
Im Allgemeinen läuft eine MySQL-Ergebnismenge übrigens auch nicht mit einer ID auf, und spätestens dann müsstest du sowieso von deiner Konvention abweichen. Ich bevorzuge da Coding-Konventionen, die robuster sind.
Eine Konvention sollte nicht allein einem Selbstzweck gerecht werden, sondern auch einen praktischen Nutzen haben. Besser fände ich es, wenn du die Konvention erstmal außen vor lässt und würde es begrüßen, wenn du statt hauptsächlich theoretischen Erörterungen mehr anhand von praktisch anwendbaren Beispielen die Geschichte durchleuchten würdest.
Nagut, nehmen wir an, wir wollen keine HTML-Ausgabe erzeugen, sondern eine JSON-Ausgabe, weil wir eine AJAX-API bedienen wollen. Arrays mit automatischen Schlüsseln werden durch json_encode() zu gewöhnlichen json-Listen (1). Arrays, bei denen die Position nicht mit dem Schlüssel übereinstimmt werden zu JSON-Objekten.
Nun, gehen wir mal davon aus, dass unsere MySQL-Ergebnismenge tatsächlich einen fortlaufenden Schlüssel liefert der bei 0 anfängt. Und diesen benutzen wir wiederum als Array-Schlüssel. Dann basteln wir den JSON-String zusammen und alles läuft glatt. Das Array wurde auf eine Liste abgebildet (2). Wenn wir aber nun einen Datensatz aus der Datenbank löschen, hätte das Array eine Lücke und es würde beim Überführen in JSON auf ein Objekt-Literal abgebildet werden (3).
echo json_encode( array('foo', 'bar', 'baz') ); // ["foo","bar","baz"]
2)
echo json_encode( array( 0 => 'foo', 1 => 'bar', 2 => 'baz' ) ); // ["foo","bar","baz"]
3)
echo json_encode( array( 0 => 'foo', 2 => 'baz' ) ); // {"0":"foo","2":"baz"}
“All right, then, I'll go to hell.” – Huck Finn