巅云智能建站平台搭建版(创业流派版)火爆上线,毕生受权!新增:文章智能收罗+全站真静态打包+都会分站+智能小法式+不法词过滤+H5自顺应+智能链词等功效功效概况
赞助文档Help

PHP多维数组元素操纵类的体例

一佰互联网站建造(www.taishanly.com) 宣布日期 2020-04-26 09:03:48 阅读数: 105

我的框架外面一个多维数组元素操纵类,首要用于读取数组中设置装备摆设数据,能够经由进程字符串节点的体例:a.b.c 来获得和设置元素,和多维数组的笼盖,有须要的能够参考下吧!

<?php
/**
 * Created by PhpStorm.
 * User: ZHOUZ
 * Date: 14-5-25
 * Time: 下战书5:32
 */

namespace SnailComponent;

/**
 * 多维数组节点读写
 * Class Node
 * @package SnailComponent
 */
class Node extends AComponent
{
  /**
   * 多维数组节点分开符
   * @var string
   */
  const SP = ".";

  /**
   * 将非字符串范例数据天生字符串节点
   * <code>
   * Node::create(array("a", "b", 1, true)) => "a.b.1.1"
   * Node::create("a", "b", null, false)  => "a.b"
   * </code>
   * @param mixed $nodes 撑持数组、肆意参数个数
   * @return string
   */
  public static function create($nodes) {
    ! is_array($nodes) && $nodes = func_get_args();
    return join(static::SP, array_filter(array_map("strval", $nodes)));
  }

  /**
   * 获得多维数组节点转化为数组键名
   * @param string $node
   * @return array
   */
  public static function explode($node) {
    return explode(static::SP, $node);
  }

  /**
   * 设置多维数组节点值
   * 注重:
   * 由于 PHP 数组数值键名长度只撑持 int 的最大长度,
   * 为避免呈现笼盖等紊乱景象,一切节点在转化为键名时都将
   * 强迫被转换为字符串范例
   * @param array & $arr 援用被操纵数组的内存地点
   * @param string $node 节点途径, 如: a.b.c => $arr["a"]["b"]["c"];
   * @param mixed $value
   * @return void
   */
  public static function set(array & $arr, $node, $value = null) {
    $arr = $arr2 = (array) $arr;
    $keys = static::explode($node);
    foreach ($keys as $key) {
      $key = strval($key);
      if (isset($arr[$key])) {
        $arr = & $arr[$key];
      } else {
        $arr[$key] = array();
        $arr = & $arr[$key];
      }
    }
    $arr = $value;
  }

  /**
   * 获得多维数组指定节点值
   * @param array & $arr 援用被操纵数组的内存地点
   * @param string $node 节点途径, 如: a.b.c => $arr["a"]["b"]["c"];
   * @param null|mixed $default 若节点不存在时前往该默许值
   * @return mixed
   */
  public static function get(array & $arr, $node, $default = null) {
    if (empty($arr)) return $default;
    $keys = static::explode($node);
    foreach ($keys as $key) {
      $key = strval($key);
      if (isset($arr[$key])) {
        $arr = & $arr[$key];
      } else {
        return $default;
      }
    }
    return $arr;
  }

  /**
   * 将第二个多维数组笼盖或增加到第一个多维数组停止归并
   * @param array & $arraySrc 援用被更新的数组
   * @param array & $arrayWordStr 援用须要归并的数据
   * @return void 地点操纵无前往值
   */
  public static function merge(array & $arraySrc, array & $arrayWordStr) {
    if (empty($arrayWordStr)) return;
    foreach ($arrayWordStr as $k=>& $v) {
      if (is_array($v) && isset($arraySrc[$k])) {
        static::merge($arraySrc[$k], $v);
      } else {
        $arraySrc[$k] = $v;
      }
    }
  }

  /**
   * 判定多维数组中是不是存在指定节点,
   * 成果同 isset 关头字 (若存在键但值为 NULL 则也会前往 false)
   * @param array & $arr 援用原数组
   * @param string $node
   * @return bool
   */
  public static function has(array & $arr, $node) {
    if (empty($arr)) return false;
    $keys = static::explode($node);
    foreach ($keys as $key) {
      $key = strval($key);
      if (isset($arr[$key])) {
        $arr = & $arr[$key];
      } else {
        return false;
      }
    }
    return true;
  }

  /**
   * 判定多维数组中是不是存在指定键
   * @param array & $arr 援用原数组
   * @param string $node
   * @return bool
   */
  public static function hasKey(array & $arr, $node) {
    if (empty($arr)) return false;
    $keys = static::explode($node);
    foreach ($keys as $key) {
      $key = strval($key);
      if (array_key_exists($key, $arr)) {
        $arr = & $arr[$key];
      } else {
        return false;
      }
    }
    return true;
  }

  /**
   * 刊出数组中的指定节点元素
   * @param array $arr
   * @param string $node
   * @return void
   */
  public static function clear(array & $arr, $node) {
    if (empty($arr)) return;
    $keys = static::explode($node);
    foreach ($keys as $key) {
      $key = strval($key);
      if (isset($arr[$key])) {
        $arr = & $arr[$key];
      } else {
        return; // 指定节点不存在亦以为是胜利
      }
    }
    $arr = null;
    unset($arr);
  }
} 

上面举个栗子:

<?php
echo "<pre>";
// 测试数组1
$arr1 = ["a"=>["b"=>["c"=>["d"=>["e"=>["f"=>"http://blog.csdn.net/zhouzme"]]]]]];
// 测试数组2
$arr2 = ["a"=>["b"=>["c"=>["h"=>["i"=>["j"=>"http://www.hihtml5.com/"]]]]]];

echo "读取已存在的多维元素: ";
echo Node::get($arr1, "a.b.c.d.e.f", "默许值"); // http://blog.csdn.net/zhouzme
echo "<hr>";

echo "读取不存在的多维元素: ";
echo Node::get($arr1, "a.b.c.d.e.g", "默许值"); // 默许值
echo "<hr>";

echo "新增加维元素: ";
Node::set($arr1, "a.b.c.d.e.g", "http://www.ai9475.com/");
print_r($arr1);
echo "<hr>";

echo "读取新增的多维元素: ";
echo Node::get($arr1, "a.b.c.d.e.g", "默许值"); // http://www.ai9475.com/
echo "<hr>";

echo "归并两个数组<br>";
Node::merge($arr1, $arr2);
print_r($arr1);

上面是对应的输入成果:

以上便是小编为大师带来的PHP多维数组元素操纵类的体例全数内容了,但愿大师多多撑持网页设想~

一佰互联是天下着名建站品牌办事商,咱们有九年、网站建造、网页设想、php开辟和域名注册及假造主机办事经历,供给的办事更是天下着名。最近几年来还整合团队上风自立开辟了可视化多用户”“3.0平台版,拖拽排版网站建造设想,轻松完成pc站、手机微网站、小法式、APP一体化全网营销网站扶植 ,已胜利的为天下上百家收集公司供给自助建站平台搭建办事。

相干消息more

28
04月
php付出宝手机网页付出类实例

本文实例报告了php付出宝手机网页付出类。分享给大师供大师参考。详细阐发以下:此处注重:① 该类是用在Yii框架外面的,不去掉一些框架的东... >>概况

23
04月
对Linux装置mysql默许设置装备摆设文件地位

在linux上面装置mysql若是在/etc上面不存在my.cnf设置装备摆设文件处理体例以下:1.经由进程which mysqld号令来检查mysq... >>概况

03
05月
你领会甚么是域名吗?

想要领会域名,起首第一步便是晓得甚么是域名?域名有几个级别?为甚么要注册域名?上面咱们一路来看看域名最根本的常识吧! 第一点:甚么是域名... >>概况

07
05月
七个有益于优化的挑选域名的技能

对网站扶植工程师来说,我不岂但要大白SEOER必须具有的本质,并且要晓得倡议客户若何挑选域名是相当主要的,由于这间接影响到网站今后的 se... >>概况

高端网站扶植

美工统筹SEO,为企业电子商务营销助力!

德律风:

023-85725751
建站

产物

域名注册 假造主机 云办事器 企业邮局
智能建站 APP打包 微站/小法式 创业平台
网站推行 媒体营销 智能收罗 AI机械人
400德律风 短信营销 店销机械人
私家定制 流派网站