首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多叶节点PHP平面阵列

多叶节点PHP平面阵列
EN

Stack Overflow用户
提问于 2012-09-06 21:29:01
回答 2查看 768关注 0票数 1

怎样才能最好地将一个具有多个叶节点的数组扁平化,以便每个完整的叶路径都是一个不同的返回?

代码语言:javascript
复制
array("Object"=>array("Properties"=>array(1, 2)));

屈服

  1. Object.Properties.1
  2. Object.Properties.2

我能够平顺到Object.Properties.1,但2没有使用递归函数处理:

代码语言:javascript
复制
function flattenArray($prefix, $array)
{
    $result = array();
    foreach ($array as $key => $value)
    {
        if (is_array($value))
            $result = array_merge($result, flattenArray($prefix . $key . '.', $value));
        else
            $result[$prefix . $key] = $value;
    }   
    return $result;
}

我认为自顶向下在预测多个叶节点时不起作用,所以要么需要某种类型的自下而上处理,要么需要为每个叶和进程复制数组(尽管这似乎完全没有效率)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-06 22:00:48

代码语言:javascript
复制
function flatten(array $data, $separator = '.') {
  $result = array();
  $stack = array();
  $path = null;

  reset($data);
  while (!empty($data)) {
    $key = key($data);
    $element = $data[$key];
    unset($data[$key]);  
    if (is_array($element)) {
      if (!empty($data)) {
        $stack[] = array($data, $path);
      }
      $data = $element;
      $path .= $key . $separator;
    } else {
      $result[$path . $key] = $element;
    }

    if (empty($data) && !empty($stack)) {
      list($data, $path) = array_pop($stack);
    }
  }
  return $result;
}

var_dump(flatten(array("Object"=>array("Properties"=>array(1, 2)))));

输出:

代码语言:javascript
复制
array(2) {
  ["Object.Properties.0"]=>
  int(1)
  ["Object.Properties.1"]=>
  int(2)
}
票数 2
EN

Stack Overflow用户

发布于 2012-09-06 21:34:07

使用来自Kdyby框架的函数Kdyby框架()

代码语言:javascript
复制
$flattened= array();
flatMapAssoc($array, function ($value, $keys) use (&$flattened) {
        $flattened[implode('.', $keys)] = $value;
});



/**
 * @param array|\Traversable $array
 * @param callable $callback
 * @return array
 */
    function flatMapAssoc($array, $callback)
{
    $callback = callback($callback);
    $result = array();
    $walker = function ($array, $keys = array()) use (&$walker, &$result, $callback) {
        foreach ($array as $key => $value) {
            $currentKeys = $keys + array(count($keys) => $key);
            if (is_array($value)) {
                $walker($value, $currentKeys);
                continue;
            }
            $result[] = $callback($value, $currentKeys);
        }

        return $result;
    };

    return $walker($array);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12308673

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档