Форум программистов, компьютерный форум, киберфорум
Наши страницы

PHP

Войти
Регистрация
Восстановить пароль
 
kadr
0 / 0 / 1
Регистрация: 29.11.2012
Сообщений: 34
#1

Из массива и объекта в Hash - PHP

11.05.2018, 13:23. Просмотров 141. Ответов 8
Метки php (Все метки)

Привет, написал для себя некий класс Hash, аналогия хеша из ruby. По сути это обычный класс, как, например stdClass. И вот проблема, для преобразования, например массива в объект stdClass - а, есть (object), мне нужно реализовать что то на подобии, для конвертации массивов и объектов stdClass - а в Hash.
Решение в лоб:
PHP
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
use Libs\Php\Hash;
 
function to_hash($data) 
{
    if (is_array($data) || is_object($data)) {
        foreach ($data as $key1 => $level1) {
            if (is_array($level1)) {
                $result->{$key1} = new Hash;
                foreach ($level1 as $key2 => $level2) {
                    if (is_array($level2)) {
                        $result->{$key1}->{$key2} = new Hash;
                        foreach ($level2 as $key3 => $level3) {
                            if (is_array($level3)) {
                                $result->{$key1}->{$key2}->{$key3} = new Hash;
                                foreach ($level3 as $key4 => $level4) {
                                    $result->{$key1}->{$key2}->{$key3}->{$key4} = $level4;
                                }
                            } else {
                                $result->{$key1}->{$key2}->{$key3} = $level3;
                            }
                        }
                    } else {
                        $result->{$key1}->{$key2} = $level2;
                    }
                }
            } else {
                $result->{$key} = $level1;
            }
        }
    }
 
    return $result;
}
понятно, что очень не красиво и ограничено 4 вложенностью. Как это реализовано в том же (object) не нашел, может кто подскажет как это можно нормально реализовать. При помощи рекурсии не получилось, проблема со свойствами, а точнее в цепочке вложенности свойств, не понял как реализовать.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.05.2018, 13:23
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Из массива и объекта в Hash (PHP):

Показать из массива 2 объекта - PHP
Есть сайт на опенкарт, вставляю такой код в шапку сайта <?$this->load->model('catalog/product'); // only if not yet 'loaded' within the...

Расшифровка hash - PHP
Подскажите, реально ли расшифровать функцию hash "sha256" есть код <?php $day_hash =...

Hash('sha128') - PHP
Существует ли алгоритм sha128 для ф-ции hash(), проверил у себя на денвере и еще на 1 хостинге и там не обнаружилось данного алгоритма.

Hash API Авторизация - PHP
Здравствуйте, столкнулся с проблемой авторизации на своём сайте. При отправке данных скрипт выдает данную ошибку:Warning:...

Вывод фото из папки объекта, название которой совпадает с ID этого объекта - PHP
Д.День. суть вопроса такая есть путь в корне CMS images/objects_db/xxxxA где xxxxA это папки (создаваемые сторонним софтом) с...

Подскажите по классу и вывод массива из объекта - PHP ООП
class s_qry { function sql_one($p,$c,$Cat=array(),$lim_1,$lim_2){ $strSql=Array(); $strSql = "SELECT .... FROM ...."; ...

8
Para bellum
Эксперт PHP
3127 / 2890 / 638
Регистрация: 06.01.2011
Сообщений: 8,440
13.05.2018, 07:41 #2
sezialize используйте для преобразования объекта/массива в строку, потом хешируйте.
0
kadr
0 / 0 / 1
Регистрация: 29.11.2012
Сообщений: 34
14.05.2018, 09:56  [ТС] #3
Не совсем понял, можно примерчик простенький.
0
Para bellum
Эксперт PHP
3127 / 2890 / 638
Регистрация: 06.01.2011
Сообщений: 8,440
14.05.2018, 10:18 #4
PHP
1
2
3
$data = new StdClass;
 
echo serialize($data);
Таким образом и сериализуйте Ваш объект.
0
kadr
0 / 0 / 1
Регистрация: 29.11.2012
Сообщений: 34
14.05.2018, 10:38  [ТС] #5
PHP
1
2
3
$data = new StdClass;
 
echo serialize($data);
Это то понятно, не понятно как лучше реализации метод конвертации, то решение, которое я я описал выше, слишком неповоротливое, не универсальное, так сказать, поэтому и спрашиваю, может есть более элегантное решение.
0
Para bellum
Эксперт PHP
3127 / 2890 / 638
Регистрация: 06.01.2011
Сообщений: 8,440
14.05.2018, 10:51 #6
Что-то я недопонял, видимо. Прочитал наскоро.
Думал, надо объект хешировать, а у Вас просто преобразование из одного в другой...
0
kadr
0 / 0 / 1
Регистрация: 29.11.2012
Сообщений: 34
17.05.2018, 12:52  [ТС] #7
Походу более изящного подхода нет, а может кто нибудь знает как найти реализацию метода (object) в php?
0
Para bellum
Эксперт PHP
3127 / 2890 / 638
Регистрация: 06.01.2011
Сообщений: 8,440
17.05.2018, 13:38 #8
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Такая функция подойдёт?
PHP
1
2
3
4
5
6
7
8
9
10
function to_object($data, $target)
{
    $result = new $target;
    
    foreach ($data as $key => $value) {
        $result->$key = is_array($value) ? to_object($value, $target) : $value;
    }
 
    return $result;
}
Использование:
PHP
1
to_object($data, 'Hash');
В функцию можно добавить проверки на существование класса и на то, является ли $data массивом или объектом. На Ваше усмотрение.
1
kadr
0 / 0 / 1
Регистрация: 29.11.2012
Сообщений: 34
18.05.2018, 08:10  [ТС] #9
Да это подходит, благодарю.
PHP
1
2
3
4
$arr = (object)['test' => 1, 2, 'test3' => 3, [1, 2, 3, ['aaa', 'dddd', 'qqq' => '1111', [12, 3232, 4355, 655, [666, 987, 66544, ['qwqwe' => 'asdasdas']]]]]];
или
$arr = ['test' => 1, 2, 'test3' => 3, [1, 2, 3, ['aaa', 'dddd', 'qqq' => '1111', [12, 3232, 4355, 655, [666, 987, 66544, ['qwqwe' => 'asdasdas']]]]]];
dump(to_hash($arr));
PHP
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
php test/test.php 
Libs\Php\Hash {#63
  +"test": 1
  +"0": 2
  +"test3": 3
  +"1": Libs\Php\Hash {#64
    +"0": 1
    +"1": 2
    +"2": 3
    +"3": Libs\Php\Hash {#65
      +"0": "aaa"
      +"1": "dddd"
      +"qqq": "1111"
      +"2": Libs\Php\Hash {#66
        +"0": 12
        +"1": 3232
        +"2": 4355
        +"3": 655
        +"4": Libs\Php\Hash {#67
          +"0": 666
          +"1": 987
          +"2": 66544
          +"3": Libs\Php\Hash {#68
            +"qwqwe": "asdasdas"
          }
        }
      }
    }
  }
}
0
18.05.2018, 08:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.05.2018, 08:10
Привет! Вот еще темы с ответами:

Оптимизируется ли компилятором конструкция switch-case? Работа со строками через ID объекта или hash - C++
Добрый вечер, 1) Определён ли порядок выбора switch (согласно стандарта кажись неопределён, но все компиляторы я уверен в этом...

.NET 4.x Получение доступа к свойствам программно созданного объекта массива из эвента этого же объекта - C#
У меня программно создается массив кнопок, и надо каждой присвоить эвент при нажатии на нее. Как получать доступ к свойствам этих кнопок,...

Ucoz hash pass to phpbb hash pass - phpBB
в ucoz выглядит так пароль: $1$d9gE$qArqNHo6j6jBcey9gGCkZ. в phpbb: $H$9NOBUC.KuIBSNJ8w4DRbrOsxqYxzyY. Как перенести пароль...

Hash+++ - C++
Скажите пожалуйста где скачать Hash subj и Hash on coure it


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru