Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中,如何更新关联数组中的值并存储整个数组?_Php - Fatal编程技术网

在PHP中,如何更新关联数组中的值并存储整个数组?

在PHP中,如何更新关联数组中的值并存储整个数组?,php,Php,下面是一个代码示例: $array = array(); $array['master']['slave'] = "foo"; foreach ($array as $key => $value) { foreach ($value as $key2 => $value2) { if (preg_match('/slave/',$key2)) { $value[$key2] = "bar"; print "$v

下面是一个代码示例:

  $array = array();

  $array['master']['slave'] = "foo";

  foreach ($array as $key => $value) {

    foreach ($value as $key2 => $value2) {

      if (preg_match('/slave/',$key2)) {

        $value[$key2] = "bar";
        print "$value[$key2] => $key2 => $value2\n";
      }
    }
  }

  print_r($array);
输出:

bar => slave => foo

Array

(

    [master] => Array

        (
            [slave] => foo
        )

)
相反,我希望将以下内容作为最终数组:

Array
(

    [master] => Array

        (
            [slave] => bar
        )

)
我怎么会在这里

谢谢大家!

注意: 示例2:

$a= array('l1'=>array('l2'=>array('l3'=>array('l4'=>array('l5'=>'foo')))));

$a['l1']['l2']['l3']['l4']['l5'] = 'bar';

foreach ($a as $i => &$values) {
    foreach ( $values as $key => &$value) {
        if (is_array($value)){
            print_array($value,$key);
        }
    }
}

function print_array ($Array, $parent) {
  foreach ($Array as $i1 => &$values1) {
    if (is_array($values1)){
      foreach ($values1 as $key1 => &$value1) {
        if (is_array($value1)) {
          print_array($value1,$values1);
        }
        else {
          print "       $key1 => $value1\n";
        }
      }
    }
    else {
      if (preg_match('/l5/',$i1)) {
        $values1 = "foobar";
        print "       $i1 => $values1\n";
      }
    }
  }
}

print_r($a);
输出不反映l5中的“foobar”

为什么不只是:

foreach ($array as $key => &$value)
{
  if(isset($value['slave']))
    $value['slave'] = 'bar';
};

因为
foreach
对数组的副本进行操作。阅读有关以下内容的文档:

注意:除非数组是引用的
foreach
对指定数组的副本而不是数组本身进行操作
foreach
对数组指针有一些副作用。在
foreach
期间或之后,如果不重置数组指针,请不要依赖它

所以你应该这么做

foreach ($array as $key => &$value) {

    foreach ($value as $key2 => $value2) {
          //...
    }
}
更新:

$a= array('l1'=>array('l2'=>array('l3'=>array('l4'=>array('l5'=>'foo')))));

$a['l1']['l2']['l3']['l4']['l5'] = 'bar';

foreach ($a as $i => &$values) {
    foreach ( $values as $key => &$value) {
        if (is_array($value)){
            print_array($value,$key);
        }
    }
}

function print_array ($Array, $parent) {
  foreach ($Array as $i1 => &$values1) {
    if (is_array($values1)){
      foreach ($values1 as $key1 => &$value1) {
        if (is_array($value1)) {
          print_array($value1,$values1);
        }
        else {
          print "       $key1 => $value1\n";
        }
      }
    }
    else {
      if (preg_match('/l5/',$i1)) {
        $values1 = "foobar";
        print "       $i1 => $values1\n";
      }
    }
  }
}

print_r($a);
好的,我再次检查了您的代码:

  • 您的代码不起作用,因为循环从未使用键
    l5
    到达阵列
  • 代码效率很低。您可以对输入数组的深度进行假设。例如,您的代码无法处理您提供的输入数组(如果省略一个数组,它应该可以工作)
  • 解决方案:

    $a= array('l1'=>array('l2'=>array('l3'=>array('l4'=>array('l5'=>'foo')))));
    
    $a['l1']['l2']['l3']['l4']['l5'] = 'bar';
    
    foreach ($a as $i => &$values) {
        foreach ( $values as $key => &$value) {
            if (is_array($value)){
                print_array($value,$key);
            }
        }
    }
    
    function print_array ($Array, $parent) {
      foreach ($Array as $i1 => &$values1) {
        if (is_array($values1)){
          foreach ($values1 as $key1 => &$value1) {
            if (is_array($value1)) {
              print_array($value1,$values1);
            }
            else {
              print "       $key1 => $value1\n";
            }
          }
        }
        else {
          if (preg_match('/l5/',$i1)) {
            $values1 = "foobar";
            print "       $i1 => $values1\n";
          }
        }
      }
    }
    
    print_r($a);
    
    利用。此代码适用于:

    $a =array('l1'=>array('l2'=>array('l3'=>array('l4'=>array('l5'=>'foo')))));
    
    function process(&$array, $needle) {
        foreach($array as $k => &$v) {
            if ($k == $needle) {
                 $v = "boooooooooo";
                 print "$k => $v\n";
            }
            if (is_array($v)) {
                 process($v, $needle);
            }
        }
    }   
    
    process($a, $needle);
    print_r($a);
    
    希望有帮助


    哦,下次请用其他钥匙。我一直认为关键是
    15
    (15),并想知道为什么我的示例不起作用;)(
    15
    看起来与
    l5
    没有太大区别)。

    因为$value是一个新变量

    您有几个选择,但都源于同一个问题,这个问题源自这一行

    foreach ($array as $key => $value) {
    
    此时,在代码中,
    $value
    不是对数据结构中数组的第二维度的引用。要解决这个问题,您有两个选择

    1) 强制引用

    foreach ($array as $key => &$value) {
    
    2) 使用“完全限定”表达式设置所需的值

    $array[$key][$key2] = 'bar';
    

    谢谢你对foreach的解释,这很有帮助。但是选项1和2给了我语法错误:“PHP解析错误:语法错误,意外的“&”因为&$array和&$value(foreach的起始元素)@健忘症-55:True,我更新了代码。我不确定它们的意思,除非数组被引用,所以我认为
    &
    必须在数组之前,但它只在值之前。第二个示例:您再次忘记在
    foreach
    子句中的
    print\u array
    函数中引用
    $values1
    $value1
    。我想你也必须参考
    $value
    。费利克斯,谢谢你,这是2D的作品。但是你能看看我编辑的问题吗?用$a作为数组名的那个,让我知道需要做什么更改?非常感谢@费利克斯:我按照你的要求修改了密码,但它仍然不适合我!我需要它拼命工作,因为它会阻塞其他东西。所以请直说我的不耐烦:)你知道吗?请看一看?@amnesia-55:更新了我的答案。谢谢!对于下面的代码,您能否帮助检测foreach中的错误?