Hello James Inger,
Thank you for reaching out.
The difference in results could be due to the permissions granted by the access token in each case.
In the Microsoft identity platform, you specify permissions that your app needs to access certain resources and the access token returned to your app is then limited to those permissions.
The access token used in your PHP app might have granted permission to access users in your Azure instance, on the other hand the access token used in Graph Explorer has been granted additional permissions to access users in Office 365 as well.
Could you please check your scope in the PHP app, "User.Read.All" or "User.ReadWrite.All" scope, which provides access to all users in the organization, including those in Office 365.
Thanks