Изменить исходные значения массива в foreach

У меня есть массив массивов, которые содержат ключ массива со значением, вот пример:

 $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;
}
}
}
}

Но это не изменило все.
Любая помощь высоко ценится, спасибо.

1

Решение

Это может помочь.

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);
}
}
}
}
2

Другие решения

как насчет прямого доступа к $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);
2

И я положу мои два цента, а также:

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

Фрагмент кода здесь

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);

распечатать массив, который мы хотим изменить ложное значение на истинное значение.

приведенный ниже код для отображения всех данных с заменой на требуемый вывод:

$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);
2

Здесь мы используем array_walk достичь желаемого результата.

Попробуйте этот фрагмент кода здесь

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

Я предполагаю, что это будет массив,

$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 = [0 => 3, 1 => 4, 2 => 5, 3 => 6];
foreach ($text as $key => &$value) {
if(in_array($key, $flag)){
$value[2] = true;
}
}
echo "<pre>";
print_r($text);

Пожалуйста, проверьте вывод Вот

1

Нет более чистого / более прямого (защищенного от ошибок) способа, чем:

Код: (демонстрация) Самый простой способ

$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 массив подвергается риску выполнения бесполезных итераций. Это будет неэффективной / плохой практикой кодирования.

1

Вы можете перебрать массив флагов и приравнять значение этих ключей к массиву требуемых значений.

$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;
}
}

Решение скрипки

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector