PHP多维数组元素操作类的方法

2025-05-29 0 25

我的框架里面一个多维数组元素操作类,主要用于读取数组中配置数据,可以通过字符串节点的方式:a.b.c 来获取和设置元素,以及多维数组的覆盖,有需求的可以参考下吧!

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172
<?php

/**

* created by phpstorm.

* user: zhouz

* date: 14-5-25

* time: 下午5:32

*/

namespace snail\\component;

/**

* 多维数组节点读写

* class node

* @package snail\\component

*/

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 & $arrayreplace 引用需要合并的数据

* @return void 地址操作无返回值

*/

public static function merge(array & $arraysrc, array & $arrayreplace) {

if (empty($arrayreplace)) return;

foreach ($arrayreplace 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);

}

}

下面举个栗子:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27
<?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多维数组元素操作类的方法

以上就是小编为大家带来的php多维数组元素操作类的方法全部内容了,希望大家多多支持快网idc~

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 PHP多维数组元素操作类的方法 https://www.kuaiidc.com/96098.html

相关文章

发表评论
暂无评论