如果依赖项是数组,我如何重新排列数组项,将依赖项移动到顶部


How can I rearrange array items moving dependencies on top if dependencies is array?

我有以下数组,其中每个项目可能(也可能不依赖)另一个:

$test = array(
    'c' => array(
        'depends' => array('b')
    ),
    'a' => array(),
    'b' => array(
        'depends' => array('a', 'd')
    ),
    'd' => array(
        'depends' => array('a')
    )
);

我想要的输出结果

$test = array(
    'a' => array(),
    'd' => array(
        'depends' => array('a')
    ),
    'b' => array(
        'depends' => array('a', 'd')
    ),
    'c' => array(
        'depends' => array('b')
    )
);

这段代码的问题类似于这个问题"如何重新排列数组项,在顶部移动依赖项?"

但有不同的是,如果依赖有多个依赖函数array_multi-sort无法对其进行排序。

我想这就是你想要的,尽管你的问题很模糊:

<?php
$input = array(
    'c' => array(
        'depends' => array('b')
    ),
    'a' => array(),
    'b' => array(
        'depends' => array('a', 'd')
    ),
    'd' => array(
        'depends' => array('a')
    )
);
$output = array();
foreach ($input as $dependant=>$settings) {
    if (   is_array($settings) 
        && isset($settings['depends']) 
        && is_array($settings['depends'])) {
        foreach ($settings['depends'] as $dependent) {
            $output[$dependent]['dependent'][] = $dependant;
        }
    }
}
var_dump($output);

输出为:

array(3) {
  'b' =>
  array(1) {
    'dependent' =>
    array(1) {
      [0] =>
      string(1) "c"
    }
  }
  'a' =>
  array(1) {
    'dependent' =>
    array(2) {
      [0] =>
      string(1) "b"
      [1] =>
      string(1) "d"
    }
  }
  'd' =>
  array(1) {
    'dependent' =>
    array(1) {
      [0] =>
      string(1) "b"
    }
  }
}
<?php
$test = array(
    'c' => array(
        'depends' => array('b')
    ),
    'a' => array(),
    'b' => array(
        'depends' => array('a', 'd')
    ),
    'd' => array(
        'depends' => array('a')
    )
);
$rearranged = array();
$test_left = $test;
do {
  $resolved = false; // Check for rounds without any move
  reset($test_left);
  while (list($key, $val) = each($test_left)) {
    $move = false;
    if (isset($val['depends']) && !empty($val['depends'])) {
      // Dependencies count must be not greater than rearranged array length
      $depends = count($val['depends']) <= count($rearranged);
      // All dependencies must be set in rearranged array already
      while ($depends && (list(, $dep_key) = each($val['depends']))) {
        if (!array_key_exists($dep_key, $rearranged)) {
          $depends = false;
        }
      }
      $move = $depends;
    } else {
      // Independent items moves to top
      $move = true;
    }
    if ($move) {
      $rearranged[$key] = $val;
      unset($test_left[$key]);
      $resolved = true;
    }
  }
}
while ($resolved && !empty($test_left));
if (empty($test_left)) {
  echo 'Success<pre>';
  print_r($rearranged);
  echo '</pre>';
} else {
  echo 'There are some unresolved dependencies';
}