Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
ArrayManager.php
Go to the documentation of this file.
1 <?php
7 
15 {
20 
25  protected $parentNode;
26 
31  protected $nodeIndex;
32 
42  public function exists($path, array $data, $delimiter = self::DEFAULT_PATH_DELIMITER)
43  {
44  return $this->find($path, $data, $delimiter);
45  }
46 
57  public function get($path, array $data, $defaultValue = null, $delimiter = self::DEFAULT_PATH_DELIMITER)
58  {
59  return $this->find($path, $data, $delimiter) ? $this->parentNode[$this->nodeIndex] : $defaultValue;
60  }
61 
72  public function set($path, array $data, $value, $delimiter = self::DEFAULT_PATH_DELIMITER)
73  {
74  if ($this->find($path, $data, $delimiter, true)) {
75  $this->parentNode[$this->nodeIndex] = $value;
76  }
77 
78  return $data;
79  }
80 
91  public function replace($path, array $data, $value, $delimiter = self::DEFAULT_PATH_DELIMITER)
92  {
93  if ($this->find($path, $data, $delimiter)) {
94  $this->parentNode[$this->nodeIndex] = $value;
95  }
96 
97  return $data;
98  }
99 
111  public function move($path, $targetPath, array $data, $overwrite = false, $delimiter = self::DEFAULT_PATH_DELIMITER)
112  {
113  if ($this->find($path, $data, $delimiter)) {
116 
117  if ((!$this->find($targetPath, $data, $delimiter) || $overwrite)
118  && $this->find($targetPath, $data, $delimiter, true)
119  ) {
120  $this->parentNode[$this->nodeIndex] = $parentNode[$nodeIndex];
121  unset($parentNode[$nodeIndex]);
122  }
123  }
124 
125  return $data;
126  }
127 
138  public function merge($path, array $data, array $value, $delimiter = self::DEFAULT_PATH_DELIMITER)
139  {
140  if ($this->find($path, $data, $delimiter) && is_array($this->parentNode[$this->nodeIndex])) {
141  $this->parentNode[$this->nodeIndex] = array_replace_recursive(
142  $this->parentNode[$this->nodeIndex],
143  $value
144  );
145  }
146 
147  return $data;
148  }
149 
159  public function populate($path, array $data, $delimiter = self::DEFAULT_PATH_DELIMITER)
160  {
161  $this->find($path, $data, $delimiter, true);
162 
163  return $data;
164  }
165 
175  public function remove($path, array $data, $delimiter = self::DEFAULT_PATH_DELIMITER)
176  {
177  if ($this->find($path, $data, $delimiter)) {
178  unset($this->parentNode[$this->nodeIndex]);
179  }
180 
181  return $data;
182  }
183 
194  protected function find($path, array &$data, $delimiter, $populate = false)
195  {
196  if (is_array($path)) {
197  $path = implode($delimiter, $path);
198  }
199 
200  if ($path === null) {
201  return false;
202  }
203 
204  $currentNode = &$data;
205  $path = explode($delimiter, $path);
206 
207  foreach ($path as $index) {
208  if (!is_array($currentNode)) {
209  return false;
210  }
211 
212  if (!array_key_exists($index, $currentNode)) {
213  if (!$populate) {
214  return false;
215  }
216 
217  $currentNode[$index] = [];
218  }
219 
220  $this->nodeIndex = $index;
221  $this->parentNode = &$currentNode;
222  $currentNode = &$currentNode[$index];
223  }
224 
225  return true;
226  }
227 
242  public function findPaths(
243  $indexes,
244  array $data,
245  $startPath = null,
246  $internalPath = null,
247  $maxResults = null,
248  $delimiter = self::DEFAULT_PATH_DELIMITER
249  ) {
250  $indexes = (array)$indexes;
251  $startPath = is_array($startPath) ? implode($delimiter, $startPath) : $startPath;
252  $internalPath = is_array($internalPath) ? implode($delimiter, $internalPath) : $internalPath;
253  $data = $startPath !== null ? $this->get($startPath, $data, [], $delimiter) : $data;
254  $checkList = [$startPath => ['start' => $startPath === null, 'children' => $data]];
255  $paths = [];
256 
257  while ($checkList) {
258  $nextCheckList = [];
259 
260  foreach ($checkList as $path => $config) {
261  foreach ($config['children'] as $childIndex => $childData) {
262  $childPath = $path . (!$config['start'] ? $delimiter : '') . $childIndex;
263 
264  if (in_array($childIndex, $indexes, true)) {
265  $paths[] = $childPath;
266 
267  if ($maxResults !== null && count($paths) >= $maxResults) {
268  return $paths;
269  }
270  }
271 
272  $searchData = $internalPath !== null && is_array($childData)
273  ? $this->get($internalPath, $childData, null, $delimiter)
274  : $childData;
275 
276  if (!empty($searchData) && is_array($searchData)) {
277  $searchPath = $childPath . ($internalPath !== null ? $delimiter . $internalPath : '');
278  $nextCheckList[$searchPath] = ['start' => false, 'children' => $searchData];
279  }
280  }
281  }
282 
283  $checkList = $nextCheckList;
284  }
285 
286  return $paths;
287  }
288 
300  public function findPath(
301  $indexes,
302  array $data,
303  $startPath = null,
304  $internalPath = null,
305  $delimiter = self::DEFAULT_PATH_DELIMITER
306  ) {
307  $paths = $this->findPaths($indexes, $data, $startPath, $internalPath, 1, $delimiter);
308 
309  return $paths ? reset($paths) : null;
310  }
311 
322  public function slicePath($path, $offset, $length = null, $delimiter = self::DEFAULT_PATH_DELIMITER)
323  {
324  return implode($delimiter, array_slice(explode($delimiter, $path), $offset, $length));
325  }
326 }
slicePath($path, $offset, $length=null, $delimiter=self::DEFAULT_PATH_DELIMITER)
merge($path, array $data, array $value, $delimiter=self::DEFAULT_PATH_DELIMITER)
$config
Definition: fraud_order.php:17
replace($path, array $data, $value, $delimiter=self::DEFAULT_PATH_DELIMITER)
find($path, array &$data, $delimiter, $populate=false)
findPaths( $indexes, array $data, $startPath=null, $internalPath=null, $maxResults=null, $delimiter=self::DEFAULT_PATH_DELIMITER)
$value
Definition: gender.phtml:16
move($path, $targetPath, array $data, $overwrite=false, $delimiter=self::DEFAULT_PATH_DELIMITER)
exists($path, array $data, $delimiter=self::DEFAULT_PATH_DELIMITER)
findPath( $indexes, array $data, $startPath=null, $internalPath=null, $delimiter=self::DEFAULT_PATH_DELIMITER)
populate($path, array $data, $delimiter=self::DEFAULT_PATH_DELIMITER)
$paths
Definition: _bootstrap.php:83
$index
Definition: list.phtml:44