GVKun编程网logo

php-动态访问多维数组值(访问动态数组元素)

7

想了解php-动态访问多维数组值的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于访问动态数组元素的相关问题,此外,我们还将为您介绍关于C语言多维数组,以及多维数组中的二维数组、php–动态创

想了解php-动态访问多维数组值的新动态吗?本文将为您提供详细的信息,我们还将为您解答关于访问动态数组元素的相关问题,此外,我们还将为您介绍关于C语言多维数组,以及多维数组中的二维数组、php – 动态创建多维数组、php – 如何组合多维数组值和键?、php – 通过ArrayAccess访问多维数组的新知识。

本文目录一览:

php-动态访问多维数组值(访问动态数组元素)

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语言多维数组,以及多维数组中的二维数组

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 – 动态创建多维数组

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
  )
*/

它只是交换数组键,而不是创建我需要的新子数组.

任何建议或解决方案将不胜感激.谢谢!

解决方法

使用一些PHP-Fu:

$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 – 如何组合多维数组值和键?

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 – 通过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按值返回一个数组,即内部值的副本. $test [‘a’] [‘b’] =’zzz’在此副本上运行,由$test [‘a’]返回.

但是你可以让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访问多维数组的相关知识,请在本站搜索。

本文标签: