想了解php-动态访问多维数组值的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于访问动态数组元素的相关问题,此外,我们还将为您介绍关于C语言多维数组,以及多维数组中的二维数组、php–动态创
想了解php-动态访问多维数组值的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于访问动态数组元素的相关问题,此外,我们还将为您介绍关于C语言多维数组,以及多维数组中的二维数组、php – 动态创建多维数组、php – 如何组合多维数组值和键?、php – 通过ArrayAccess访问多维数组的新知识。
本文目录一览:- php-动态访问多维数组值(访问动态数组元素)
- C语言多维数组,以及多维数组中的二维数组
- php – 动态创建多维数组
- php – 如何组合多维数组值和键?
- php – 通过ArrayAccess访问多维数组
php-动态访问多维数组值(访问动态数组元素)
我正在尝试查找(或创建)一个函数.我有一个多维数组:
$data_arr = [
"a" => [
"aa" => "abfoo",
"ab" => [
"aba" => "abafoo",
"abb" => "abbfoo",
"abc" => "abcfoo"
],
"ac" => "acfoo"
],
"b" => [
"ba" => "bafoo",
"bb" => "bbfoo",
"bc" => "bcfoo"
],
"c" => [
"ca" => "cafoo",
"cb" => "cbfoo",
"cc" => "ccfoo"
]
];
我想使用一维数组访问值,如下所示:
$data_arr_call = ["a", "ab", "abc"];
someFunction( $data_arr, $data_arr_call ); // should return "abcfoo"
好像已经有这类功能了,我只是不知道要搜索什么.
解决方法:
尝试这个
function flatCall($data_arr, $data_arr_call){
$current = $data_arr;
foreach($data_arr_call as $key){
$current = $current[$key];
}
return $current;
}
OP的解释:
$current变量被迭代建立,如下所示:
flatCall($data_arr, ['a','ab','abc']);
1st iteration: $current = $data_arr['a'];
2nd iteration: $current = $data_arr['a']['ab'];
3rd iteration: $current = $data_arr['a']['ab']['abc'];
您还可以在每次迭代中执行if(isset($current))…以提供错误检查.
C语言多维数组,以及多维数组中的二维数组
C 语言中的多维数组(multidimensional array)其实就是元素为数组的数组。n 维数组的元素是 n-1 维数组。例如,二维数组的每个元素都是一维数组,一维数组的元素当然就不是数组了。多维数组声明时,每个维度用一对方括号来表示:
char screen[10][40][80]; // 一个三维数组
数组 screen 包含 10 个元素,从 screen[0] 到 screen[9]。每个元素又是一个二维数组,它有 40 个元素,这 40 个元素均是一维数组,然后每个一维数组内都有 80 个字符。整体来说,screen 数组有 32000(10×40×80)个 char 类型元素。
想要获取该三维数组 screen 内的某个 char 元素,必须指定 3 个索引值。例如,下面的语句把字符Z写入该数组的最后一个元素位置:
screen[9][39][79] = 'Z';
二维数组(矩阵)
二维数组常常被称为矩阵(matrix)。它应用频繁,因此我们来更详细地讨论下矩阵。把矩阵想成列和行的排列方式,更有助于理解它。下面定义的矩阵 mat 有三行和五列:float mat[3][5];
这三个元素 mat[0]、mat[1] 和 mat[2] 是矩阵 mat 的三行。每行都是由五个 float 元素所组成的数组。因此,该矩阵包含 3×5=15 个 float 元素,如下表所示:
[0] | [1] | [2] | [3] | [4] | |
mat[0] | 0.0 | 0.1 | 0.2 | 0.3 | 0.4 |
mat[1] | 1.0 | 1.1 | 1.2 | 1.3 | 1.4 |
mat[2] | 2.0 | 2.1 | 2.2 | 2.3 | 2.4 |
上图中所指定的值可以利用嵌套循环语句赋值得到的。第一个索引值指定行,第二个索引值定位到该行中的某列:
for ( int row = 0; row < 3; ++row ) for ( int col = 0; col < 5; ++col ) mat[row][col] = row + (float)col/10;
在内存中,这三行被连续存储在一起,因为它们都是 mat 数组的元素。这样的话,该数组中的 float 值以递增的顺序存储在一起。
声明多维数组
在数组声明中,如果执行定义操作的话,数组类型可以是不完整的。也就是说,可以声明数组,却不指定其长度。这种声明所引用的数组,必须在程序其他地方指定它的长度。然而,必须声明一个数组元素的完整类型。对于一个多维数组的声明而言,只有第一个维度可以不指定长度,所有其他维度都必须指定长度。例如,在声明二维数组时,必须要指定列的数量。如果前面例子的数组 mat 有外部链接(例如,它的定义在所有函数外部),那么其他源代码文件只要做如下声明,就可以使用 mat:
extern float mat[ ][5]; // 外部声明
初始化多维数组
可以利用初始化列表来初始化多维数组,还有一些需要特别注意的地方:不必为每个维度都写一对大括号,可以使用多维元素指示符。为展示各种可能性,我们假定一个数组定义和初始化如下:
int a3d[2][2][3] = { { { 1,0 },{ 4,0 } },{ { 7,8,{ 0,0 } } };
这个初始化列表包含了三个层次的列表大括号,并且用下面的值初始化二维数组 a3d[0] 和 a3d[l] 的元素:
[0] | [1] | [2] | |
a3d[0][0] | 1 | 0 | 0 |
a3d[0][1] | 4 | 0 | 0 |
[0] | [1] | [2] | |
a3d[1][0] | 7 | 8 | 0 |
a3d[1][1] | 0 | 0 | 0 |
因为所有只要没与初始化器的元素,就会被初始化为默认的 0,所以下面的定义具有一样的效果:
int a3d[ ][2][3] = { { { 1 },{ 4 } },8 } } };
该初始化列表也显示出三个层次的大括号。不需要指定第一个维度为 2,因为最外面的初始化列表包含两个初始化器。
也可以省略某些大括号。如果某对大括号包含了比对应数组维度中元素数量还多的初始化器,那么多出来的初始化器会被关联到存储序列中的下一个数组元素中。因此,下面这两个定义是等价的:
int a3d[2][2][3] = { { 1,4 },{ 7,8 } }; int a3d[2][2][3] = { 1,4,7,8 };
最后,可以利用元素指示符达到相同的初始化目的,如下所示:
int a3d[2][2][3] = { 1,[0][1][0]=4,[1][0][0]=7,8 };
上述定义等同于:
int a3d[2][2][3] = { {1},[0][1]={4},[1][0]={7,8} };
如果只有一小部分的元素需要被初始化为 0 以外的值,那么使用元素指示符是一个不错的做法。
php – 动态创建多维数组
例如:
preg_match('/([A-Z])\-?([0-9])\-?([0-9]{1,3})/i','A-1-001',$matches);
返回:
Array ( [0] => A-1-001 [1] => A [2] => 1 [3] => 001 )
我要转换为:
$foo = array( 'A' => array( '1' => array( '001' => array('some','information') ) ) );
这样我就可以将它与另一个多维数组合并,如下所示:
$bar['A']['1']['001'] = array('some','other','information');
该过程需要处理任意数量的匹配/维度.
以下是我目前的做法.我没有理解这个概念,因为这种尝试远远落后于我的目标.
$foo = array(); $j = count($matches); for ($i = 1; $i < $j; $i++) { $foo[ $matches[$i - 1] ] = $matches[$i]; } /* $foo's structure becomes: Array ( [A-1-001] => A [A] => 1 [1] => 001 ) */
它只是交换数组键,而不是创建我需要的新子数组.
任何建议或解决方案将不胜感激.谢谢!
解决方法
$matches = array('A-1-001','A',1,'001'); $info = array('some','information'); print_r(tree($matches,$info)); function tree($array,$info){ $max = count($array)-1; $result = array($array[$max] => $info); for($i=$max-1;$i>0;$result = array($array[$i--] => $result)); return $result; }
输出:
Array ( [A] => Array ( [1] => Array ( [001] => Array ( [0] => some [1] => information ) ) ) )
php – 如何组合多维数组值和键?
array ( 1 => array ( 't' => array ( 0 => 't1',1 => 't2',2 => 't3',),'c' => array ( 0 => 'c1',1 => 'c2',2 => 'c3','d' => array ( 0 => 'd1',1 => 'd2',2 => 'd3',2 => array ( 'j' => array ( 0 => 'j1',1 => 'j2',2 => 'j3','m' => array ( 0 => 'm1',1 => 'm2',2 => 'm3','n' => array ( 0 => 'n1',1 => 'n2',2 => 'n3',)
我需要输出
array( 1=>array( 't-j'=>array('t1-j1','t2-j2','t3-j3'),'c-m'=>array('c1-m1','c2-m2','c3-m3'),'d-n'=>array('d1-n1','d2-n2','d3-n3') ) );
而我所做的就是
$i = 0; $res = []; foreach($arr[1] as $key => $value){ foreach($arr[2] as $k => $v){ $res[$key.'-'.$k][] = $value[$i].'-'.$v[$i]; } $i++; }
但是给我这样的东西呢?
Array ( [t-j] => Array ( [0] => t1-j1 ) [t-m] => Array ( [0] => t1-m1 ) [t-n] => Array ( [0] => t1-n1 ) [c-j] => Array ( [0] => c2-j2 ) [c-m] => Array ( [0] => c2-m2 ) [c-n] => Array ( [0] => c2-n2 ) [d-j] => Array ( [0] => d3-j3 ) [d-m] => Array ( [0] => d3-m3 ) [d-n] => Array ( [0] => d3-n3 ) )
所以我搜索了很多这方面的链接,至少尝试了大部分可以做的事情.但是我无法充分利用它
$array1 = $arr[1]; $array2 = $arr[2]; $result = combineArray($array1,$array2); var_dump($result); function combineArray($array1,$array2) { $res = []; foreach ($array1 as $key => $value) { $otherArray = array_splice($array2,1 ); $otherKey = array_keys($otherArray)[0]; $smallerResult = array(); foreach ($value as $smallerKey => $smallerValue) { $smallerResult[] = $smallerValue . '-' . $otherArray[$otherKey][$smallerKey]; } $res[$key . '-' . $otherKey] = $smallerResult; } return $res; }
我得到的输出如下:
array(3) { 't-j' => array(3) { [0] => string(5) "t1-j1" [1] => string(5) "t2-j2" [2] => string(5) "t3-j3" } 'c-m' => array(3) { [0] => string(5) "c1-m1" [1] => string(5) "c2-m2" [2] => string(5) "c3-m3" } 'd-n' => array(3) { [0] => string(5) "d1-n1" [1] => string(5) "d2-n2" [2] => string(5) "d3-n3" } }
php – 通过ArrayAccess访问多维数组
<?PHP class test implements ArrayAccess { var $var; function __construct() { $this->var = array( 'a' => array('b' => 'c'),'d' => array('e' => 'f'),'g' => array('h' => 'i') ); } function offsetExists($offset) { return isset($this->var); } function offsetGet($offset) { return isset($this->var[$offset]) ? $this->var[$offset] : null; } function offsetSet($offset,$value) { if (is_null($offset)) { $this->var[] = $value; } else { $this->var[$offset] = $value; } } function offsetUnset($offset) { unset($this->var[$offset]); } } $test = new test(); $test['a']['b'] = 'zzz'; print_r($test->var);
我想要做的是显示如下内容:
Array ( [a] => Array ( [b] => zzz ) [d] => Array ( [e] => f ) [g] => Array ( [h] => i ) )
实际显示的内容更像是:
Array ( [a] => Array ( [b] => c ) [d] => Array ( [e] => f ) [g] => Array ( [h] => i ) )
即. $test [‘a’] [‘b’]不变.
知道如何使用该语法使其可更改吗?我可以将$test [‘a’]分配给变量然后执行$temp [‘b’] =’zzz’;然后做$test [‘a’] = $temp;但是idk – 这似乎过分了.
解决方法
但是你可以让offsetGet返回一个引用:
function &offsetGet($offset) { $null = null; if (isset($this->var[$offset])) { return $this->var[$offset]; } return $null; }
请注意,我还必须修改方法体,因此返回后总是后跟变量,而不是表达式.
演示:
https://3v4l.org/4jGMN
Output for 5.4.7 – 7.0.0rc2,hhvm-3.6.1 – 3.9.0
06001
更新
您甚至可以将其简化为:
function &offsetGet($offset) { return $this->v[$offset]; }
因为如果通过引用返回不存在的变量,则会隐式创建它们.这样,您可以创建新的嵌套元素,如下所示:
$test['new']['nested'] = 'xxx';
演示:https://3v4l.org/OSvuA
今天关于php-动态访问多维数组值和访问动态数组元素的讲解已经结束,谢谢您的阅读,如果想了解更多关于C语言多维数组,以及多维数组中的二维数组、php – 动态创建多维数组、php – 如何组合多维数组值和键?、php – 通过ArrayAccess访问多维数组的相关知识,请在本站搜索。
本文标签: