在foreach中更改原始数组值

时间:2017-09-07 05:39:57

标签: php arrays

我有一个数组数组,其中包含带有值的数组键,例如:

 $text = [
         [
         0 => ['Andi', 'NOB', false],
         1 => ['menginap', 'V', false],
         2 => ['di', 'PREP', false],
         3 => ['Hotel', 'N', false],
         4 => ['Neo', 'NE', false],
         5 => ['Malioboro', 'NE', false],
         6 => ['selama', 'N', false],
         7 => ['satu', 'NUM', false],
         8 => ['minggu', 'N',false]
        ]
    ];

我也有这个数组:

$flag = [3,4,5,6]; 

现在,如果标志元素数组在文本键上,那么我将第三个元素从false更改为true。

例如: $ flag [0] = 3,然后我将使用键3将文本更改为:

[3] = > 'Hotel', 'N', true

这就是我现在正在做的事情:

foreach($text as $index => &$tok){
    foreach ($tok as $tokkey => &$tokvalue) {
        foreach($flag as $key => $value){
           if($value == $tokkey){
               $tokvalue[2] = true;
           }
        }
   }
}

但是,它并没有改变一切。 非常感谢任何帮助,谢谢。

8 个答案:

答案 0 :(得分:2)

这可能会有所帮助。

foreach($text as $index => &$tok){
    foreach ($tok as $tokkey => &$tokvalue) {
        foreach($flag as $key => $value){
           if($value == $tokkey){
               $val = explode(",",$tokvalue);
               $val[2] = true;
               $tokvalue = implode(",",$val);
           }
        }
   }
}

答案 1 :(得分:2)

这里我们使用array_walk来实现所需的输出。

Try this code snippet here

array_walk($text[0],function(&$value,$key) use($flag){
     if(in_array($key, $flag)){ // checking whether the $key is present in the flag array
        $value[2]=true;//change the $value second index to true
     }
});

答案 2 :(得分:2)

尝试一下,它会为你工作:

$text = [
        [
            '0' => 'Andi,NOB,false',
            '1' => 'menginap,V,false',
            '2' => 'di,PREP,false',
            '3' => 'Hotel,N,false',
            '4' => 'Neo,NE,false',
            '5' => 'Malioboro,NE,false',
            '6' => 'selama,N,false',
            '7' => 'satu,NUM,false',
            '8' => 'minggu,N,false'
        ]
        ];
$flag = [3,4,5,6] ;

foreach($text as $k=> $value){
foreach($flag as $key=> $val){
       $kk[] = explode(',',$value[$val]);
       $kk[$key][2] = 'true';
       $kkk[] = implode(',',$kk[$key]);
}
}
echo '<pre>'; print_r($kkk);

打印我们想要将false值更改为true值的数组。

以下代码显示所有数据并替换所需的输出:

$text = [
        [
            ['Andi', 'NOB', 'false'],
            ['menginap', 'V', 'false'],
            ['di', 'PREP', 'false'],
            ['Hotel', 'N', 'false'],
            ['Neo', 'NE', 'false'],
            ['Malioboro', 'NE', 'false'],
            ['selama', 'N', 'false'],
            ['satu', 'NUM', 'false'],
            ['minggu', 'N.', 'false']
        ]
        ];

$flag = [3,4,5,6];

foreach ($text as $k => $value) {
        foreach ($value as $kk => $val) {
            foreach ($flag as $key) {
                if ($key == $kk)
                    $text[$k][$kk][2] = 'true';
            }
        }
}

 echo '<pre>'; print_r($text);

答案 3 :(得分:1)

我假设这是数组,

class Player(object):
    # has a self.hand attribute and a `self.game.deck` attribute
    def hit(self):
        self.hand.append(self.game.deck.deal(1))

请检查输出here

答案 4 :(得分:1)

如何直接访问$text

$text[$index][$tokkey][2] = true;

这样您就不需要使用引用。

$text = [
  [
    ['Andi', 'NOB', false],
    ['menginap', 'V', false],
    ['di', 'PREP', false],
    ['Hotel', 'N', false],
    ['Neo', 'NE', false],
    ['Malioboro', 'NE', false],
    ['selama', 'N', false],
    ['satu', 'NUM', false],
    ['minggu', 'N.', false]
  ]
];

$flag = [3,4,5,6];

foreach ($text as $index => $token) { // outer list
  foreach ($token as $i => $t) { //inner list
    foreach ($flag as $key) {
      if ($key == $i)
        $text[$index][$i][2] = true;
    }
  }
}

print_r($text);

答案 5 :(得分:1)

我也将我的两分钱投入:

foreach($flag as $key){
    $text[0][$key][2] = true;
}

Code snippet here

答案 6 :(得分:1)

没有更清洁/更直接(防错)的方式:

代码 :( Demo)最简单的方式

$flag=3; // index 
if(isset($text[0][$flag][2])){$text[0][$flag][2]=true;}  // make sure the element exists

如果您有多个标志:

$flags=[3,6,7]; // indices 
foreach($flags as $flag){
   if(isset($text[0][$flag][2])){$text[0][$flag][2]=true;}  // make sure the element exists
}

循环$text数组的任何方法都有可能运行无用的迭代。这将是低效/差的编码实践。

答案 7 :(得分:0)

您可以遍历标志数组,并将这些键值与所需值的数组相等。

$flag = [1,3];

$text = [
    0 => ['a', 'x', true],
    1 => ['a', 'y', false],
    2 => ['x', 'd', true],
    3 => ['x', 's', true],
    4 => ['a', 'x', false],
];

foreach ($flag as $key) {
    if (isset($text[$key])) {
        $text[$key][2] = true;
    }
}

Solution fiddle