PHP动态数组索引名称

3
我想将一个数组的索引值(例如 ['client_name'])传递给一个函数。一级值可以正常工作,因为我可以这样做:
        $index = client_name;

        function arraything ($index) { return $this->arraytolookat[$index]; }

问题是...如果它是一个多层嵌套的数组,我该怎么做呢?

我尝试了eval语句,但显然它不能很好地评估方括号...所以我尝试了这个。

        $index = “[0][‘client_name’]”;

        Eval(“$this->arraytolookat$index”);

但是它总是失败……抱怨了一个意外的 [ - 有什么想法吗?
编辑:我不知道这个函数可能需要进入多少级,因此我不能只在末尾添加一定数量的括号。这并不像看起来那么简单^^
编辑2:基本上——我编写了一个表单验证工具,其中一个函数返回正确的POST数据——我想要一个简单的方法,当您输入表单元素的名称时,它会直接将POST数据返回到该元素,例如getFormData(“client_name”)——但是当表单变得更加复杂时,它可以进入数组,我需要为getFormData(“['$i']client_name”)或类似的东西做好准备,在该类中会发生一些后续操作,因此必须使用该函数。我只想让该函数接受字符串而不是数组。

function xy ($a, $b) { return $this->array[$a][$b]; } 有什么问题吗? - KingCrunch
抱歉,我应该说...我不知道可能需要多少层函数嵌套。因此,我不能假设可能需要的括号数量。 - Jonathan Tizard
5个回答

10

你可以将索引的数组传递给下面的函数。所以,如果你想要获取 $some_array[0]['client_name']['third_level_index'],那么你可以这样做:

function get_array_value(array $array, array $indexes)
{
    if (count($array) == 0 || count($indexes) == 0) {
        return false;
    }

    $index = array_shift($indexes);
    if(!array_key_exists($index, $array)){
        return false;
    }

    $value = $array[$index];
    if (count($indexes) == 0) {
        return $value;
    }

    if(!is_array($value)) {
        return false;
    }

    return get_array_value($value, $indexes);
}

$some_array = array(/* nested array */);

$indexes = array(0, 'client_name', 'third_level_index');

$value = get_array_value($some_array, $indexes);

一针见血。我从未想过那个。简单易行! - Jonathan Tizard
1
@Vic Imi Borbas 如果需要在那个位置写入数据怎么办?这里返回的是一些动态传递键的值。如果我需要修改该键处的数据怎么办? - Sohaib

5
function arraything ($arrayOfIndexes) {
  $current = $this->array;
  foreach ($arrayOfIndexes as $curIndex) {
    $current = $current[$curIndex];
  }
  return $current;
}

$x = arraything (array(0, 'client_thing'));

这里没有验证(例如缺少的键),但是思路应该很清楚。


你可以添加一个验证条件,如 if(!is_array($current)){ return $current; } - mjspier
是的。然后用 array_key_exists() 就可以完成工作了。我忽略它只是为了使代码片段更紧凑。 :) - KingCrunch
抱歉,我不明白那个会有多层级?每个数组元素都是键索引的一部分吗? - Jonathan Tizard
这只是Imi Borbas(见下文)递归的迭代变体。| 您没有一个关键索引,而是有多个(因为您想要多级下降;))。该参数是键的有序数组(请参见示例并将其与问题中的进行比较)。 - KingCrunch
谢谢,我投票支持Lmi borbas的答案,因为相比你的示例,我更容易在脑海中理解它在做什么 - 但是如果它与你的示例完全一样,那么还是感谢你的帮助 :-) 我给你点赞。干杯 - Jonathan Tizard

2

get_array_value函数运作良好。因此,我还编写了一个set_array_value函数。

以下是代码:

function get_array_value($array, $indexes)
{
  if (count($indexes) == 1)
  {
    return $array[$indexes[0]];
  }

  $index = array_shift($indexes);
  return get_array_value($array[$index], $indexes);
}

function set_array_value(&$array, $indexes, &$value)
{
  if (count($indexes) == 1)
  {
    return $array[reset($indexes)] = $value;
  }

  $index = array_shift($indexes);
  return set_array_value($array[$index], $indexes, $value);
}

$some_array = array();
$some_array[0]['client_name']['id'] = 1;
$some_array[1]['client_name']['id'] = 2;

$indexes = array(0, 'client_name', 'id');
$value = get_array_value($some_array, $indexes);
print_r($value);

$id = 23;
set_array_value($some_array, $indexes, $id);
$value = get_array_value($some_array, $indexes);
print_r($value);

希望这能帮到您:-)
:Nirav

0
$first = arraything(0);

echo $first['client_name'];

听起来你试图在这个参数上负载过多的东西。它能被重写以更整洁的方式允许这个吗?你可以直接返回这个...

$this->arraytolookat[0]['client_name'];

一些框架有一个助手函数,可以使用运算符(如 . )访问数组成员(当然是在字符串中)。

抱歉,我应该说...我不知道可能需要进入多少层函数。 - Jonathan Tizard
基本上 - 我写了一个表单验证工具,其中一个函数返回正确的POST数据 - 我想要一个简单的方法,当你输入表单元素的名称时 - 它会直接将POST数据返回到该元素,例如getFormData("client_name") - 但是当表单变得更加复杂时,它可能会进入数组,我需要为getFormData("['$i']client_name")或类似的东西做好准备,在那个类中postdata发生了一些事情,所以必须使用该函数。 - Jonathan Tizard

0

我尝试了foreach循环,但不确定它是否是最佳解决方案。代码大致如下:

foreach($array as $key => $value){
   arraything ($key);
}

或者使用 array_keys() 函数


欢迎来到StackOverflow。我已经编辑了您的答案,以更好地反映代码部分。如果您希望可以通过点击“x时间前编辑”来回滚它。 - Decent Dabbler
我正在尝试仅使用字符串而不是数组来实现此方法。 - Jonathan Tizard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接