还有另一种方式,而不是通过引用来做我想做的事情

时间:2013-09-20 12:53:27

标签: php recursion

我有以下数据结构:

Contract有一个数组projects,可以有X个项目。每个Project都有一个数组subProjects,其中包含相同的Project类型,因此从理论上讲,您可以拥有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;
}

1 个答案:

答案 0 :(得分: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)
   }
}