I’m having a $data array which holds 4 indexes. What I’m trying to achieve here is to set the values from the $data array to the nested foreach loop but and the end of the execution it’s storing the value of the last index.
<?php
// Some IDs.
$nids = [12, 56, 55, 59, 83];
$data = [
'Ludo Bagman' => 'Head of the Department of Magical Games and Sports within the Ministry of Magic.',
'Bathilda Bagshot' => 'Author of A History of Magic, and the great aunt of Gellert Grindelwald.',
'Katie Bell' => 'Gryffindor Quidditch Chaser one year above Harry Potter. Member of Dumbledore's Army.',
'Cuthbert Binns' => 'Ghost, History of Magic professor.',
];
foreach ($nids as $nid) {
$term = Drupal::entityTypeManager()->getStorage('node')->load($nid);
$paragraphs = $term->get('field_paragraphs')->referencedEntities();
foreach ($paragraphs as $key => $paragraph) {
if (in_array($key, [0, 1, 3, 6])) {
// Here, only the last element from the $data array is stored, i.e. value
// of `Cuthbert Binns`, whereas each of the above `$key` should take the
// value from the `$data` array in chronological order.
foreach ($data as $title) {
$paragraph->get('field_links')->setValue([
'title' => $title,
]);
}
$paragraph->save();
}
}
}
In the above code, I’m trying to loop-in to only 4 $paragraph, each of them should have value such as:
$paragraph[0]['field_links']['title']; // Head of the Department of Magical Games and Sports within the Ministry of Magic. $paragraph[1]['field_links']['title']; // Author of A History of Magic, and the great aunt of Gellert Grindelwald. $paragraph[3]['field_links']['title']; // Gryffindor Quidditch Chaser one year above Harry Potter. Member of Dumbledore's Army. $paragraph[6]['field_links']['title']; // Ghost, History of Magic professor.
But it is:
$paragraph[0]['field_links']['title']; // Ghost, History of Magic professor. $paragraph[1]['field_links']['title']; // Ghost, History of Magic professor. $paragraph[3]['field_links']['title']; // Ghost, History of Magic professor. $paragraph[6]['field_links']['title']; // Ghost, History of Magic professor.
Advertisement
Answer
In case you want to set the title to the keys.
$data = [
'Ludo Bagman' => 'Head of the Department of Magical Games and Sports within the Ministry of Magic.',
'Bathilda Bagshot' => 'Author of A History of Magic, and the great aunt of Gellert Grindelwald.',
'Katie Bell' => 'Gryffindor Quidditch Chaser one year above Harry Potter. Member of Dumbledore's Army.',
'Cuthbert Binns' => 'Ghost, History of Magic professor.',
];
$keys = [0,1,3,6];
$keyedData = array_combine($keys, $data);
// ...
foreach ($paragraphs as $key => $paragraph) {
if (in_array($key, $keys)) {
$paragraph->get('field_links')->setValue([
'title' => $keyedData[$key],
]);
$paragraph->save();
}
}
In case you need the names in the future:
$keyedNames = array_combine($keys, array_keys($data));