code: private function filterRequiredPackages(RepositoryInterface $repo, PackageInterface $package, $bucket = array())
      {
          $requires = array_keys($package->getRequires());
  
          $packageListNames = array_keys($bucket);
          $packages = array_filter(
              $repo->getPackages(),
              function ($package) use ($requires, $packageListNames) {
                  return in_array($package->getName(), $requires) && !in_array($package->getName(), $packageListNames);
              }
          );
  
          $bucket = $this->appendPackages($packages, $bucket);
  
          foreach ($packages as $package) {
              $bucket = $this->filterRequiredPackages($repo, $package, $bucket);
          }
  
          return $bucket;
      }
docs: Find package requires and child requires
  
  @param  RepositoryInterface $repo
  @param  PackageInterface    $package
  @param  array               $bucket
  @return array