Страницы

Поиск по вопросам

четверг, 29 ноября 2018 г.

Как улучшить код по получению непустого элемента из массива?

Вводные: есть некий массив с ключами, есть строка с несколькими ключами, один из которых подойдет к этому массиву (т.е. элемент с таким ключом будет существовать).
Задача минимум: наиболее красиво получить значение первого элемента массива, ключ которого подойдет.
Задача максимум: наиболее красиво получить значение первого элемента массива, ключ которого подойдет, а если подойдут несколько ключей, выдать ошибку.
Задача сверх максимума: наиболее красиво получить значение первого элемента массива, ключ которого подойдет, а если подойдут несколько ключей, выдать ошибку. При этом, если ключ передан как fields[name_1], нужно понять, что имеется ввиду вложенность в элемент и обработать очередной элемент массива в соответствии с этим.
На данный момент реализована задача минимум, но без красоты, на мой взгляд. Вот код:
function get_non_zero( $str_keys, $data ) { $keys = explode( ',', $str_keys ); foreach ( $keys as $key ) { if ( ! empty( $data[ $key ] ) ) { return $data[ $key ]; } }
return null; }
$data = ['key0' => 0, 'key1' => 1, 'key3'=> 3]; echo( get_non_zero( 'key1,key2', $data ) ); // выведет 1
Может быть, у кого-то есть идеи, как это реализовать более понятно и красиво, возможно, вообще без функции?


Ответ

Если пишите для себя, то можно так:
$data = ["key0" => 0, "key1" => 1, "key3"=> 3];
$search = array_flip(explode(",", "key1,key2")); $result = array_intersect_key($data, $search);
echo count($result) > 1 ? null : array_pop($result);
Если с кодом будут работать и другие, тогда лучше в функцию, с комментариями и красивым ветвлением.
function getNonZero($keys, $data) { $search = array_flip(explode(",", $keys)); $result = array_intersect_key($data, $search);
if (count($result) > 1): return null; else: return array_pop($result); endif; }
$data = ["key0" => 0, "key1" => 1, "key3"=> 3]; $search = "key1,key2";
echo getNonZero($search, $data);
"Сверх максимум"
function searchInArray($value) { preg_match("([\w+]{1,})", $value, $matches); return !empty($matches) ? $matches[0] : $value; }
function getNonZero($search, $data) { $search = array_map("searchInArray", explode(",", $search)); $result = array_intersect_key($data, array_flip($search));
if (count($result) === 1): return is_array($result) ? array_shift($result[key($result)]) : $result; else: return null; endif; }
$data = ['key0' => 0, 'fields' => ['name_1'=>1], 'key3'=> 3]; $sting = 'name,entry.436917433,billing_first_name,fields[name_1]';
echo getNonZero($sting, $data);

Комментариев нет:

Отправить комментарий