3 namespace Civi\Api4\Utils
;
5 use CRM_Utils_Array
as UtilsArray
;
7 class ArrayInsertionUtil
{
10 * If the values to be inserted contain a key _parent_id they will only be
11 * inserted if the parent node ID matches their ID
14 * The array to insert the value in
16 * Path to insertion point with structure:
17 * [[ name => is_multiple ], ..]
18 * @param mixed $values
19 * The value to be inserted
21 public static function insert(&$array, $parts, $values) {
23 $isMulti = array_shift($parts);
24 if (!isset($array[$key])) {
25 $array[$key] = $isMulti ?
[] : NULL;
28 $values = self
::filterValues($array, $isMulti, $values);
29 $array[$key] = $values;
33 foreach ($array[$key] as &$subArray) {
34 self
::insert($subArray, $parts, $values);
38 self
::insert($array[$key], $parts, $values);
50 private static function filterValues($parentArray, $isMulti, $values) {
51 $parentID = UtilsArray
::value('id', $parentArray);
54 $values = array_filter($values, function ($value) use ($parentID) {
55 return UtilsArray
::value('_parent_id', $value) == $parentID;
59 $unsets = ['_parent_id', '_base_id'];
60 array_walk($values, function (&$value) use ($unsets) {
61 foreach ($unsets as $unset) {
62 if (isset($value[$unset])) {
63 unset($value[$unset]);
69 $values = array_shift($values);