【问题标题】:count dimensions in complex multidimensional array in PHP在 PHP 中计算复杂多维数组中的维度
【发布时间】:2014-05-26 23:14:43
【问题描述】:

我不确定这个问题是否已经得到解答,但我想知道是否有一种简单的方法可以计算数组的维数而无需递归调用函数。

这是我的数组可能看起来的示例......

$a[0][1][2][3]=4;
$a[0][11][22]=33;
$a[0][111]=222;
$a[0][1][2][3][4][5][6][7]=888;
$a[0][1][2][3][4][5][6][7][8]=999;

但我的真实数组不一定是数字。

我想要输出的是上面示例中的以下值...

3、2、1、7 和 8

任何人都可以在不需要递归函数调用或大量 CPU 使用的情况下为我指出正确的方向吗?


更新:

我之所以问这个问题是因为我确实有一个大问题要解决。我在网上借用了一个函数,在使用 print_r() 函数后,它实际上将我的邻接表处理成一个数组,如下所示:

Array
(
[Pint] => Array
    (
    [Beer] => Array
        (
        [Parent] => Pint
        )

    [Parent] => 
    )

[Into] => Array
    (
    [Running] => Array
        (
        [Group] => Array
            (
            [Girl] => Array
                (
                [Parent] => Group
                )

            [Guy] => Array
                (
                [Parent] => Group
                )

            [Parent] => Running
            )

        [Parent] => Into
        )

    [Parent] => 
    )

)

我想要做的是使用数组中的数据形成一个句子,而不使用固定的数字或名称,因为数组名称和值(除了键Parent)会发生变化。

所以在这个数组中,我想用单词组成以下句子并遍历数组:

Desired sentence 1. A Pint of Beer(后面我会加上“A”和“of”。Pint和Beer来自数组。)

期望的句子 2. 一群女孩和男孩遇到某事(“and”、“in a”和“something”是我稍后会添加到句子中的词)

如果有一个像 foreach 这样的函数从最后一个维度开始并工作到第一个维度,那可能会有所帮助。这些句子的共同点是,最后一个维度先处理,第一个维度最后处理。

有人对答案有想法吗?

附:我更新了其他代码以使数组如下:

Array
(
[Girl] => Array
    (
    [Group] => Array
        (
        [Running] => Array
            (
            [Into] => 
            )

        )

    )

[Guy] => Array
    (
    [Group] => Array
        (
        [Running] => Array
            (
            [Into] => 
            )

        )

    )

[Beer] => Array
    (
    [Pint] => 
    )

)

【问题讨论】:

  • 首先 $a[0] 是 1 维,所以 $a[0][111] 将是 2 维,而不是您猜测的 1。
  • 你是对的....我忘记更新了。我在 foreach 循环上想得太多了。
  • @MikeSt 查看我的更新答案.. 查看您的数据,递归深度应该不是问题。

标签: php multidimensional-array


【解决方案1】:

您在所有这些数组的维度上都相差无几。您的输出应该是 4、3、2、8 和 9。不幸的是,array_walk_recursive 是您最好的选择。

【讨论】:

  • OP 专门说“不需要递归函数调用”
  • 我明白这一点。具体来说,他或她说“不需要递归函数调用或大量 CPU 使用”,这让我相信他们错误地认为这样的操作会占用大量 CPU。它可能适用于特别庞大的阵列。没有递归的唯一方法是使用堆栈和队列,这将至少同样占用 CPU。因此,我的回答是,他或她的“最佳选择”将是使用单行 array_walk_recursive()。 array_walk_recursive() 不会遍历空数组元素,因此它也可能不起作用。
  • 这不是一个单行,他们仍然需要通过回调来实际计算尺寸。我很确定我的解决方案无需递归且无需堆栈或队列即可工作。
  • 在以下情况下不起作用: (1) 数组有非数字索引。 (2) 数组没有零索引。 (3) 数组的索引为零,子数组比另一个索引少。
【解决方案2】:

好吧,无论如何,这是一个递归解决方案。它给出了最深维度的计数:

function count_array_dimensions($a, $count) {
    $max = $count;
    foreach($a as $e) {
        if(is_array($e)) {
            $current = count_array_dimensions($e, $count+1);
            if($current > $max) {
                $max = $current;
            }
        }
    }

    return $max;
}

//Usage:
$a[0][1][2][3][4][5][6][7][8]=999;

//Initialize with 0 instead of 1 for your counting scheme
echo count_array_dimensions($a, 1);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    • 2016-10-13
    • 2016-02-13
    • 2012-01-07
    • 1970-01-01
    相关资源
    最近更新 更多