Skip to content

Instantly share code, notes, and snippets.

@errogaht
Last active December 14, 2016 05:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save errogaht/c30b9dba0d210fcabb7f0461d4ccd02e to your computer and use it in GitHub Desktop.
Save errogaht/c30b9dba0d210fcabb7f0461d4ccd02e to your computer and use it in GitHub Desktop.
<?php
$x = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'];
function recursiveCompact($array, $value)
{
$arrayDeeper = function (&$arr, $value) use (&$arrayDeeper) {
$last = array_pop($arr);
$return = [$last => $value];
if (count($arr) > 0) {
$return = $arrayDeeper($arr, $return);
}
return $return;
};
$array = array_reverse($array);
return $arrayDeeper($array, $value);
}
print_r(recursiveCompact($x, ''));
<?php
/**
* Написать функцию которая из этого массива
*/
$data1 = [
'parent.child.field' => 1,
'parent.child.field2' => 2,
'parent2.child.name' => 'test',
'parent2.child2.name' => 'test',
'parent2.child2.position' => 10,
'parent3.child3.position' => 10,
];
//сделает такой и наоборот
$data = [
'parent' => [
'child' => [
'field' => 1,
'field2' => 2,
]
],
'parent2' => [
'child' => [
'name' => 'test'
],
'child2' => [
'name' => 'test',
'position' => 10
]
],
'parent3' => [
'child3' => [
'position' => 10
]
],
];
function dotUnDot($var)
{
$result = [];
/**
* Определяет что нужно делать - превращать точки в массив или наоборот
* Если возвращает true, то значит на вход подали массив с точками
* @return bool
*/
$isNeedUnDot = function () use (&$isNeedUnDot, &$var) {
$keys = array_keys($var);
$firstKey = reset($keys);
return strpos($firstKey, '.') !== false;
};
/**
* Превращает одномерный массив в многомерный, поочереди вкладывая элемент в элемент
* @param $arr
* @param $value
* @return array
*/
$arrayDeeper = function (&$arr, $value) use (&$arrayDeeper) {
$last = array_pop($arr);
$return = [$last => $value];
if (count($arr) > 0) {
$return = $arrayDeeper($arr, $return);
}
return $return;
};
/**
* Превращает строку с dot нотацией в массив
* @param $dots
* @param $value
* @return array
*/
$unDot = function ($dots, $value) use (&$unDot, $arrayDeeper) {
$undotted = explode('.', $dots);
return $arrayDeeper($undotted, $value);
};
/**
* Превращает массив в dot нотацию
* @param $k
* @param $array
* @return array
*/
$dotify = function ($k, $array) use (&$dotify) {
$array2 = [];
foreach ($array as $key => $item) {
$dotKey = $k . '.' . $key;
$array2[$dotKey] = $item;
}
if (is_array($array2) && is_array(reset($array2))) {
$return = [];
foreach ($array2 as $key => $v) {
$return = array_merge($return, $dotify($key, $v));
}
return $return;
}
return $array2;
};
$funcName = $isNeedUnDot() ? $unDot : $dotify;
foreach ($var as $k => $array) {
$result = array_merge_recursive($result, $funcName($k, $array));
}
return $result;
}
var_dump(dotUnDot($data));
var_dump(dotUnDot($data1));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment