У меня есть массив массивов, которые содержат ключ массива со значением, вот пример:
$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;
}
}
}
}
Но это не изменило все.
Любая помощь высоко ценится, спасибо.
Это может помочь.
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);
}
}
}
}
как насчет прямого доступа к $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);
И я положу мои два цента, а также:
foreach($flag as $key){
$text[0][$key][2] = true;
}
попробуйте, это будет работать для вас:
$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);
Здесь мы используем 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
}
});
Я предполагаю, что это будет массив,
$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);
Пожалуйста, проверьте вывод Вот
Нет более чистого / более прямого (защищенного от ошибок) способа, чем:
Код: (демонстрация) Самый простой способ
$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
массив подвергается риску выполнения бесполезных итераций. Это будет неэффективной / плохой практикой кодирования.
Вы можете перебрать массив флагов и приравнять значение этих ключей к массиву требуемых значений.
$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;
}
}