为什么我的 PHP 函数返回两个结果和一个意外结果?

Why does my PHP function returned two result with one unexpected result?

这是一个从两个查询中获取文件的函数。当查询$pegawai->simpegFilePegawai()中不存在文件时,会继续在查询$pegawai->skpdSimpegFilePegawai()中查找。

我预计结果是 "file_id":1729467 的对象。你可以在调试结果中看到。 然而,正如我们在调试结果中看到的那样,该函数返回了另一个结果,即空数组。

我不明白,为什么我的函数返回两个结果?。你能解释一下为什么吗,我应该怎么做才能解决这个问题。

代码:

 public static function getFileSerdikTerakhir(Pegawai $pegawai, $stagging = false) {
    $query = $pegawai->riwayatSertifikat();

    if ($stagging) {
        $query = $pegawai->skpdRiwayatSertifikat();
    }
    $serdik = $query->where('nama_sertifikat', 'ilike', "%sertifikat pendidik%")
                        ->orderByDesc('tanggal_sertifikat')
                        ->get();
    
    $info = [];
    foreach ($serdik as $key => $item) {
        $query = $pegawai->simpegFilePegawai();
        if ($stagging) {
            $query = $pegawai->skpdSimpegFilePegawai();
        }

        $info = $query->where('file_lokasi', 'ilike', "%[{$item->sertifikat_id}] Sertifikat%")->first();

        Log::debug('staging');
        Log::debug($stagging);
        Log::debug('end staging');
        
        Log::debug('info foreach');
        Log::debug($info);
        Log::debug('end info foreach');
        
        if ($info) break;
    }

    if (empty($info) && ! $stagging) {
        Log::debug('empty info');
        SyaratPengajuan::getFileSerdikTerakhir($pegawai, true);
    }

    Log::debug('----return info----');
    Log::debug($info);
    Log::debug('----end return info----');
    return $info;
}

调试结果:

[2021-04-16 08:19:46] staging.DEBUG: empty info  
[2021-04-16 08:19:46] staging.DEBUG: staging  
[2021-04-16 08:19:46] staging.DEBUG: 1  
[2021-04-16 08:19:46] staging.DEBUG: end staging  
[2021-04-16 08:19:46] staging.DEBUG: info foreach  
[2021-04-16 08:19:46] staging.DEBUG: {"file_id":1729467,"peg_id":197805022009012001,"file_nama":"[6950] Sertifikat","file_lokasi":"197805022009012001\/197805022009012001_[6950] Sertifikat.pdf","file_ket":"Sertifikat","file_tgl":"2021-04-16T14:22:10.000000Z","created_at":null,"updated_at":"2021-04-16T07:22:10.472371Z","create_username":null,"update_username":null,"m_spg_file_pegawai_id":40,"entity_id":6950}  
[2021-04-16 08:19:46] staging.DEBUG: end info foreach  
[2021-04-16 08:19:46] staging.DEBUG: ----return info----  
[2021-04-16 08:19:46] staging.DEBUG: {"file_id":1729467,"peg_id":197805022009012001,"file_nama":"[6950] Sertifikat","file_lokasi":"197805022009012001\/197805022009012001_[6950] Sertifikat.pdf","file_ket":"Sertifikat","file_tgl":"2021-04-16T14:22:10.000000Z","created_at":null,"updated_at":"2021-04-16T07:22:10.472371Z","create_username":null,"update_username":null,"m_spg_file_pegawai_id":40,"entity_id":6950}  
[2021-04-16 08:19:46] staging.DEBUG: ----end return info----  
[2021-04-16 08:19:46] staging.DEBUG: ----return info----  
[2021-04-16 08:19:46] staging.DEBUG: array (
)  
[2021-04-16 08:19:46] staging.DEBUG: ----end return info---- 

您看到两个 returns 的原因很简单 - 您的函数调用自身!

从调试信息中,我们可以看到以下内容: 第一次 运行s,$info 必须为空,所以它进入 if 块(因为我们在日志中看到 empty info)。

此时,函数 再次调用自身 。因此,下一个日志块(从 staging 到我们第一次看到 ----end return info---- )全部来自函数的第二个 运行。

然而,一旦完成,它 returns 控制第一个 运行 - 因为 $info 在那个版本中仍然是空的,你会看到第二个 ----return info---- 日志,和空数组。

这就解释了你所看到的。但我怀疑您错过了一些东西 - 除非您要对它的数据做一些事情,否则再次调用您的函数没有什么意义 returns。目前您的代码忽略了函数的第二次调用返回的内容 - 即使那是包含数据的那个!

你应该改变这个:

SyaratPengajuan::getFileSerdikTerakhir($pegawai, true);

对此:

$info = SyaratPengajuan::getFileSerdikTerakhir($pegawai, true);

这将使用从第二个 运行 返回的数据填充函数第一个 运行 中的 $info,从而为原始调用者提供正确的数据(以及就像用数据填充日志一样)。