1

我的问题.. 我有一个看起来像这样的 PHP 数组:

[1013] => [1154]
[1013] => [1322]
[1154] => [1525]
[1525] => [1526]

我怎样才能把它移到这样的地方:

[1013] => [1154] => [1525] => [1526]
[1013] => [1322]

所以它有点像创建一个与顶级数组项相关联的树。我无法控制数据是如何到达我的,它是通过第三方 API 生成的,然后就这样提供给我。

逻辑:客户端 1013 为主账户。客户端 1154 是 1013 的客户端。客户端 1322 是 1013 的客户端。客户端 1525 是 1154 的客户端。我想将其转换为多维数组,以便以树格式显示。

4

3 回答 3

2

干得好!:

<?php
// dataset
$clientset = array(
  array(1013, 1154),
  array(1013, 1322),
  array(1154, 1525),
  array(1525, 1526)
);

$children = array();

// make an array with children to see which nodes have none
foreach($clientset as $set) {
  if(!isset($children[$set[0]])) $children[$set[0]] = array($set[1]);
  else $children[$set[0]][] = $set[1];
}

// array with parents
$parents = array();
foreach($clientset as $set) {
  $parents[$set[1]] = $set[0];
}

// for each node with no children, begin the search!
foreach($clientset as $set) {
  if(!isset($children[$set[1]])) {
  echo getPath($set[1]).'</br>';
  }
}

// recursively search to parents and print them
function getPath($child) {
  global $parents;
  if($parents[$child]) {
    return (getPath($parents[$child]).' => '.$child);   
  } else return $child;
}
?>

这输出:

1013 => 1322
1013 => 1154 => 1525 => 1526

这个想法是查看哪些节点没有子节点。然后,遍历他们的父母。您可能不需要像现在这样的输出,但我相信您可以通过这种方式解决它。享受!

于 2012-08-01T12:10:39.917 回答
1

您可以使用array_walkphp 函数将回调应用于源数组的每个元素。回调应根据您的要求创建一个新数组。回调函数将采用 2 个参数:当前数组元素的值和它的键。使用它很容易构建您需要的数组。

于 2012-08-01T12:04:13.543 回答
0

克里斯,你应该先给我发电子邮件。:-p

$test_array = array('1','2','3','4','5','6');
$output_string = '';
for ($i = 0; $i < sizeof($test_array) -1; $i++)
{
    $output_string .= '{"'.$test_array[$i].'":';
}
$output_string .= $test_array[$i];
for ($i = 0; $i < sizeof($test_array)-1; $i++) { $output_string .= '}'; }
$new_array = json_decode($output_string, true);

var_dump($new_array);
于 2012-08-01T13:30:32.593 回答