【问题标题】:While loop on multi-dimensional array多维数组上的while循环
【发布时间】:2021-08-11 23:39:10
【问题描述】:

所以我有一个当前有一个 foreach 的函数,它的效果非常好,但我不得不将它更改为一个 while 循环:

请注意我公司的开发人员不想使用 foreach,他们认为 while 循环会更有效,但我不明白这会如何被执行,所以我需要一些帮助

所以我有以下函数$post_blocks是一个数组数组):

public function parse_block_data(string $block_name, string $selector, $post_id)
{
    if (!has_blocks($post_id)) {
        return false;
    }
    $post_blocks = parse_blocks(get_the_content('', false, $post_id));
    foreach ($post_blocks as $block) {
        if ($block_name != $block['blockName']) {
            continue;
        }
        if (!isset($block['attrs']['id'])) {
            return false;
        }
        if (isset($block['attrs']['data'][$selector])) {
            return $block['attrs']['data'][$selector];
        } else {
            break;
        }
    }

    return false;
}

它使用参数构建一个数组,如下所示:
Output

所以我开始在函数内部构建一个 while 循环,但我不知道如何在不使用 foreach 或者甚至可能的情况下实现它,所以我将 foreach 替换为:

// I get the 9 counts of $post_blocks correctly.

$block = 0;
while ($block < count($post_blocks)) 

    // If the $block_name doesn't match `blockName` value inside the multi-dimensional array, then continue iterating until the end and then return false.

    // If ['attrs']['id'] is not set, return false.

    // At last, if we have a blockName and a ID and the selector is set, return ['attrs']['data'][$selector]

}

所有帮助将不胜感激!这对我来说毫无意义,但如果有人能提供帮助,我将永远感激不尽!

【问题讨论】:

  • 你今天早些时候有没有问过类似的问题?

标签: php


【解决方案1】:

它和你的foreach循环基本一样,你只是通过索引数组来设置迭代变量,然后手动增加索引。

$block_num = 0;
while ($block_num < count($post_blocks)) {
    $block = $post_blocks[$block_num];
    if ($block_name == $block['blockName']) {
        if (!isset($block['attrs']['id'])) {
            return false;
        }
        if (isset($block['attrs']['data'][$selector])) {
            return $block['attrs']['data'][$selector];
        } else {
            break;
        }    
    }

    $block_num++;
}

我不确定你的同事为什么认为这更可取。

如果他们希望你遵循某种公司编码风格,你为什么不问问他们应该是什么?

【讨论】:

  • 对我来说,这似乎都是 PHP5-6 样式,我正在尝试使用 PHP 7 和 8 进行改进 - 似乎正在倒退,但这有效! continue 是否也用于 while 循环?我认为他们想要一个 while 循环的原因是不再使用 continue/break,我应该在那里迭代吗?
  • AFAIK PHP 7/8 中没有任何东西可以简化这一点。
  • 我通过反转if 测试摆脱了continue
  • 你的男人!但是现在他们会抱怨他们讨厌嵌套的 if 语句,这是他们的座右铭 - 所以看起来我根本赢不了,他们的说法是:Eliminate all choices by returning early
  • 摆脱break 的唯一方法是如果while 条件本身表达了与破坏条件相反的情况。但由于它嵌套在多个条件中,所以会非常复杂。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-05
  • 1970-01-01
  • 2021-12-13
  • 1970-01-01
  • 2016-02-07
相关资源
最近更新 更多