4

次のデータ構造があります。

AContractには配列 がprojectsあり、X 個のプロジェクトを持つことができます。それぞれに同じタイプを含むProject配列があるため、理論的には Project-SubProjects-Project の無限ツリーを持つことができます...subProjectsProject

とにかく、各プロジェクトには一意の 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;
}
4

1 に答える 1

1

ID. _ 各Projectオブジェクトに、->id参照できるプロパティを持たせます。問題が解決しました?

また、Projectフラット配列に が存在しない場合、 を返すことにまったく問題はありませんnull

class Contract {
   private $projects_flat = array();

   ....

   private function get_project($id) {
      return (isset($this->projects_flat[$id]) ? $this->projects_flat[$id] : null)
   }
}
于 2013-09-20T13:19:53.937 に答える