1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
<?php
namespace Civi\Api4\Utils;
use CRM_Utils_Array as UtilsArray;
class ArrayInsertionUtil {
/**
* If the values to be inserted contain a key _parent_id they will only be
* inserted if the parent node ID matches their ID
*
* @param $array
* The array to insert the value in
* @param array $parts
* Path to insertion point with structure:
* [[ name => is_multiple ], ..]
* @param mixed $values
* The value to be inserted
*/
public static function insert(&$array, $parts, $values) {
$key = key($parts);
$isMulti = array_shift($parts);
if (!isset($array[$key])) {
$array[$key] = $isMulti ? [] : NULL;
}
if (empty($parts)) {
$values = self::filterValues($array, $isMulti, $values);
$array[$key] = $values;
}
else {
if ($isMulti) {
foreach ($array[$key] as &$subArray) {
self::insert($subArray, $parts, $values);
}
}
else {
self::insert($array[$key], $parts, $values);
}
}
}
/**
* @param $parentArray
* @param $isMulti
* @param $values
*
* @return array|mixed
*/
private static function filterValues($parentArray, $isMulti, $values) {
$parentID = UtilsArray::value('id', $parentArray);
if ($parentID) {
$values = array_filter($values, function ($value) use ($parentID) {
return UtilsArray::value('_parent_id', $value) == $parentID;
});
}
$unsets = ['_parent_id', '_base_id'];
array_walk($values, function (&$value) use ($unsets) {
foreach ($unsets as $unset) {
if (isset($value[$unset])) {
unset($value[$unset]);
}
}
});
if (!$isMulti) {
$values = array_shift($values);
}
return $values;
}
}
|