次のデータ構造があります。
AContract
には配列 がprojects
あり、X 個のプロジェクトを持つことができます。それぞれに同じタイプを含むProject
配列があるため、理論的には Project-SubProjects-Project の無限ツリーを持つことができます...subProjects
Project
とにかく、各プロジェクトには一意の ID があり、特定のプロジェクトを検索し、そのプロジェクトを最上位から変更してから、変更したコントラクトをセッションに保存する必要があります。現在、私は見つけたプロジェクトへの参照を返す再帰関数を介してそれを行っていますが、検索すればするほど、人々は PHP 参照を好まないようです。理由がわかりません、誰かが問題を説明できますか?私がやりたいことをするためのより良い方法はありますか?
いくつかのコード:
// Get the associative array version of the contract (it's stored as JSON)
$contract = json_decode($contract, true);
if(array_key_exists('projects', $contract))
{
$resultProject = &$this->findProject($contract['projects'], $projectId);
if($resultProject)
{
$resultProject[$inputData['propertyName']] = $inputData['value'];
\Session::put('workingContract', json_encode($contract));
// return 200
}
}
// Return 404
/**
* Performs a depth-first search to find a project.
*
* @param array $projects
* @param $projectId
* @return null
*/
private function &findProject(array &$projects, $projectId)
{
foreach($projects as &$project)
{
if($project['_id']['$id'] == $projectId)
{
return $project;
}
if(array_key_exists('subProjects', $project))
{
$result = &$this->findProject($project['subProjects'], $projectId);
return $result;
}
}
$null = null; // TODO: shitty hack for inability to return null when function returns a reference. Need to rethink use of references in general. Is there another way???
return $null;
}