检查数组的递归情况

2024-02-25

在 PHP 中检查数组是否递归的最佳方法是什么?

给出以下代码:

<?php 
$myarray = array('test',123); 
$myarray[] = &$myarray; 
print_r($myarray); 
?> 

来自PHP 手册: http://www.php.net/manual/en/language.types.array.php#73936

print_r() 将显示递归当到了第三个的时候 数组的元素。

似乎没有任何其他方法可以扫描数组 递归引用,所以如果你需要检查它们,你必须 使用 print_r() 及其第二个参数来捕获输出并查看 为了这个词递归.

有没有更优雅的检查方式?

附言。这就是我使用正则表达式和 print_r() 检查和获取递归数组键的方法

$pattern = '/\n            \[(\w+)\] => Array\s+\*RECURSION\*/';
preg_match_all($pattern, print_r($value, TRUE), $matches);
$recursiveKeys =  array_unique($matches[1]);

Thanks


尝试解决“不可能”的问题总是很有趣!

如果递归发生在顶层,下面的函数将检测递归数组:

function is_recursive(array &$array) {
    static $uniqueObject;
    if (!$uniqueObject) {
        $uniqueObject = new stdClass;
    }

    foreach ($array as &$item) {
        if (!is_array($item)) {
            continue;
        }

        $item[] = $uniqueObject;
        $isRecursive = end($array) === $uniqueObject;
        array_pop($item);
        if ($isRecursive) {
            return true;
        }
    }

    return false;
}

查看实际效果 http://ideone.com/OqTKSl.

检测递归any级别显然会更加棘手,但我认为我们可以同意这似乎是可行的。

Update

这是递归(不是双关语,但仍然令人愉快)解决方案,可以检测任何级别的递归:

function is_recursive(array &$array, array &$alreadySeen = array()) {
    static $uniqueObject;
    if (!$uniqueObject) {
        $uniqueObject = new stdClass;
    }

    $alreadySeen[] = &$array;

    foreach ($array as &$item) {
        if (!is_array($item)) {
            continue;
        }

        $item[] = $uniqueObject;
        $recursionDetected = false;
        foreach ($alreadySeen as $candidate) {
            if (end($candidate) === $uniqueObject) {
                $recursionDetected = true;
                break;
            }
        }

        array_pop($item);

        if ($recursionDetected || is_recursive($item, $alreadySeen)) {
            return true;
        }
    }

    return false;
}

查看实际效果 http://ideone.com/2IQwpQ.

当然,也可以通过手动保存堆栈来编写迭代而不是递归,这在出现非常大的递归级别问题的情况下会有所帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检查数组的递归情况 的相关文章

  • 使用 phpdocx 下载损坏的 .docx

    我有一个项目 我们使用 phpdocx pro 在模板中生成 docx 文件 我可以很容易地将数据输入到模板中 但是当下载文件并在 MS Word 2010 中打开时 程序报告无法打开文件 因为内容存在问题 详细信息是 文件已损坏 并且无法
  • 如何将我的 json 字符串 avro 二进制编码为字节数组?

    我有一个实际的 JSON 字符串 我需要将其 avro 二进制编码为字节数组 在经历了Apache Avro 规范 http avro apache org docs 1 7 7 spec html 我想出了下面的代码 我不确定这是否是正确
  • file_get_contents 大文件上传

    我正在尝试使用 fsockopen 上传 2GB 以上的大文件 但 file get content 出现以下错误 我无法在内存中存储大文件 我需要分块发送数据 但不知道如何执行此操作 请问有人可以指导我吗 致命错误 允许的内存大小 134
  • php基于onclick函数输入日期类型

    用户选择日期 月份和年份 然后按一个按钮 根据他选择的日期向他显示数据库的值 不知道代码问题出在哪里
  • 将查询字符串附加到任何形式的 URL

    我要求用户在文本框中输入 URL 并需要向其附加查询字符串 URL 的可能值如下 http www example com http www example com http www example com a http www examp
  • 删除二维数组C++[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 这两种释放二维数组的方法是否相似 int M new int 5 for int i 0 i lt 5 i M i new int 3 fo
  • PHP - 警告:strpos() [function.strpos]: 空分隔符是什么意思?

    警告 strpos function strpos 空分隔符是什么意思 我有这个 if strpos 039 text false text str replace 039 text 猜测一下 我会说 text是一个空字符串 感谢马克指出细
  • Facebook iFrame 应用程序 - 摆脱垂直滚动条?

    我已经转换了一个 Facebook 应用程序 http apps facebook com video preferans 从 FBML 到 iFrame 使用 PHP SDK 现在显示的垂直滚动条与我之前显示的内容数量相同 一个徽标 一个
  • 纯基于网络的版本控制系统

    我的托管服务当前不允许在其服务器上运行 允许 svn git cvs 我真的希望能够将我的开发计算机上的当前源代码与我的生产服务器 同步 我正在寻找一个纯php python ruby版本控制系统 不只是一个client对于版本控制系统 不
  • PHP DOM - 剥离 span 标签,保留其内容

    我希望采用如下标记 span class test Some text that is strong bolded strong and contains a a href link a span 并在 PHP 中找到剥离跨度的最佳方法 剩
  • 从 php 执行 bash 脚本并立即输出回网页

    我有一组 bash 和 Perl 脚本 开发在 Linux Box 上部署所需的目录结构 可选 从svn导出代码 从这个源构建一个包 这在终端上运行良好 现在 我的客户请求此流程的 Web 界面 例如 某些页面上的 创建新包 按钮将一一调用
  • PHP-docker容器中的环境变量

    我想在我的 docker 容器中显示一个环境变量 PHP 脚本如下所示 我使用 OpenShift 来启动容器 PHP 容器显示 env is 现在我更改容器的 dc 配置 oc env dc envar USER Pieter deplo
  • 付款成功后保存到数据库(paypal)

    我试图找出在客户使用 paypal 支付商品费用后将数据 之前以表单提交 保存到数据库的最佳方法 沿着这个过程的一些事情 1 在实际网站上填写表格 gt 2 登录 Paypal gt 3 立即付款 PayPal gt 4 数据已插入数据库
  • PHP 脚本不断执行 mmap/munmap

    我的 PHP 脚本包含一个循环 它只不过是回显和取消引用指针 如 tab othertab i gt 中的内容 直到昨天 这个脚本开始变得非常慢 比以前慢了 50 倍 之前 它一直运行良好 使用 strace 后 我发现 90 的情况下 脚
  • 使(文本到图像)图像具有一定的宽度但无限的长度?

    我有下面的代码 可以用大量文本生成图像 我希望该图像的宽度为 700 像素 我还希望它保留字符串所具有的段落结构 该字符串来自 MySQL 数据库 我怎样才能实现这一点 font 2 width imagefontwidth font st
  • ACL授权失败后ZF3重定向

    我有一个带有 ACL 的新 ZF3 应用程序 现在 我需要在未经授权的访问的情况下重定向到错误页面 例如 403 我认为最好的方法是触发一个事件 然后捕获它 但我失败了 全部都在我的用户模块中Module php 摘录 namespace
  • jQuery / Ajax:如何循环遍历数组作为 Ajax 成功函数的一部分

    我有一个阿贾克斯调用返回一个数组并需要对该数组中的每个值执行某些操作 到目前为止 我有以下内容 但这会返回以下错误 Uncaught TypeError Cannot use in operator to search for length
  • 设置大型电子邮件通知系统有哪些方法?

    我的公司有一个用 PHP 构建的网站 我们使用内置的 PHP 电子邮件功能每天向订阅者发送数千封电子邮件 这是一个糟糕的主意 它堵塞了我们的服务器 并且需要几个小时才能完成整个批次 现在我已经研究过像 MailChimp 这样的群发邮件服务
  • 归并排序中的递归:两次递归调用

    private void mergesort int low int high line 1 if low lt high line 2 int middle low high 2 line 3 mergesort low middle l
  • PHP 共享标头而不使用服务器端脚本?

    到目前为止我总是通过 PHP 解决简单的问题 您有一个包含页眉 菜单 页脚和内容字段的网站 每个页面的页眉 菜单和页脚通常是相同的 在没有 PHP 或任何其他服务器端语言的情况下 如何使页眉 菜单和页脚数据仅存在于一个文件中 例如 您不会有

随机推荐

  • 如何获取系统上可用的所有 Microsoft Media Foundation Transforms (MFT) 的列表

    我是 Windows 上本机开发的新手 但我的任务是创建一个小应用程序 该应用程序将列出各种视频 音频编解码器的所有转换器 查看 MSDN 文档 似乎没有太多关于执行此操作的直接文档 我发现的文档表明此信息存储在注册表中 不确定在哪里 因此
  • DataGrid 列与字典绑定

    我需要帮助将字典绑定到 wpf DataGrid 列 什么在起作用 以 int 为键的字典 Dictionary
  • 从子组件中修改 props.value

    我是 Vue 新手 正在尝试构建一个 下拉 组件 我想从父组件中使用它 如下所示
  • 在 macOS 10.14.6 上的 Python 3.7.4 中导入 ssl 时出错

    为什么我在尝试在 python3 中导入 ssl 时收到错误 Python 3 7 4 default Jul 9 2019 18 13 23 Clang 10 0 1 clang 1001 0 46 4 on darwin Type he
  • 无法使用c保存图像文件?

    我尝试将一个 bmp 图像克隆到另一个 bmp 图像中 但最终的图像无法打开 include
  • 从 WinRT 下的 WebView 复制内容

    我有一个WebView我想将一些 HTML 内容转换为 RTF 我研究过 RTF 转换函数 老实说它们看起来都有点不稳定 所以我的想法是复制内容WebView into a RichEditBox 然后从那里保存为 RTF 这个例子我已经看
  • 使用 CSS 对图像进行跨浏览器亮度过滤

    我需要使用全尺寸图片作为背景 并且需要该图片具有亮度滤镜 目前仅在进行中Chrome and Firefox 最后一个使用 svg 这就是我所拥有的 img fullscreenIMG display block position abso
  • 如何使VB.NET函数的参数成为Generic类型?

    我有一个如下所示的 VB NET 函数 传递给该函数的参数 x 的类型为 Single 但是 我想编写该函数 以便它可以接受任何数字类型 例如 Single Double 和 Integer 我知道一种方法是编写 3 个具有相同名称的函数
  • 获取我的 Heroku 应用程序的有限 IP 地址列表?

    我有一个客户想要向我的 Heroku 应用程序发送 GET 请求 他们要求提供一份 IP 地址列表 以将其防火墙的出口列入白名单 我意识到这可能每周或更频繁地更改 但是是否有可能获得我的 Heroku 应用程序可能所在的 IP 的有限列表
  • iPhone应用程序生命周期中的最后一个功能是什么

    在我的应用程序关闭之前 我必须从网络服务中注销用户 我找不到应用程序死亡之前调用的最后一个函数 void LogoutUser int userId GlobalData sharedMySingleton getUserId NSStri
  • 是否有一个格式说明符始终表示带有 _tprintf 的字符字符串?

    当您在 Windows 上构建应用程序时 使用TCHAR支持 s in tprintf means char Ansi 构建的字符串和wchar t 对于 Unicode 构建 同时 S意思是相反 但是是否有任何格式说明符总是意味着char
  • Docker 原生 Windows 支持吗?

    我很难找到这方面的信息 我在某处看到消息称 Docker 现在已原生集成到 Windows 中 那么显然这意味着它们不是 Linux 容器 而是某种 Windows 容器 有人有这方面的更多信息吗 由于许多 Docker 收购 出现了重大更
  • Docker上下文如何使用特定的ssh密钥

    我想使用 docker 上下文通过 ssh 联系服务器 我的本地有许多不同的 ssh 密钥 如何告诉上下文使用特定的键 我试过了 docker context create test docker host ssh
  • Swagger 未找到 ApiVersion ed 操作

    我正在 ASP NET Core 中构建 Web API 并尝试多个版本 我正在按照以下说明为每个版本创建 Swagger 文档 https github com domaindrivendev Swashbuckle AspNetCore
  • 如何在我的map/reduce函数中调用mongodb?这是一个好的做法吗?

    我想知道是否 首先 是否可以在我的map reduce函数中使用mongodb函数 例如 function foo db myCollection find id ObjectId 4ee235ce002c62f393000008 prin
  • php中的jquery ajax停止重新加载页面[重复]

    这个问题在这里已经有答案了 当我单击书籍链接时 他重新加载页面并对列进行排序 我想使用ajax停止重新加载 如何 这是我在这个过程中的职责 这个 getBook 函数 public function getBooks start 0 lim
  • 用内置的角度动画替换 jQuery 动画

    给定这个模板 div h2 TEST headline Title h2 div 以及以下指令 我如何将该指令更改为replace the jquery内置淡入淡出angular动画 我要求文本淡出 替换 然后淡入 newman direc
  • 默认情况下 ASP.NET 4.0 代码在哪个帐户中执行?

    比方说 我有一个访问 读 写 文件系统 应用程序内的文件 Active Directory 和 SQL Server 数据库的应用程序 我需要授予该帐户权限 以便他访问这些内容 应用程序池标识为 IIS APPPOOL ASP NET v4
  • Android 4.0 c2dm问题

    当我使用 android c2dm 将通知推送到我的设备时 我遇到了一个奇怪的问题 如果我使用 管理应用程序 gt 我的应用程序 gt 强制停止 关闭应用程序 并且尝试向我的设备发送推送 则它不起作用 它适用于我所有其他 Android 版
  • 检查数组的递归情况

    在 PHP 中检查数组是否递归的最佳方法是什么 给出以下代码 来自PHP 手册 http www php net manual en language types array php 73936 print r 将显示递归当到了第三个的时候