Преобразование всех ключей в змеиный регистр в многомерном массиве в PHP

Опубликовано: 20 Февраля, 2023

В случае со змеей нам нужно преобразовать данное предложение или слово в стиль письма, в котором все символы верхнего регистра будут заменены строчными буквами, а все пробелы заменены символом подчеркивания (_). В этой статье мы увидим, как найти змеиный регистр всех ключей данного массива.

Здесь нам нужно проверить каждый из элементов, присутствующих в массиве, а затем преобразовать его в случай змеи. Есть одна возможность, что массив может содержать некоторые значения, змеиный регистр которых будет таким же, как и он. Для решения этой проблемы ниже обсуждаются два подхода:

Подход 1: В первом подходе объявляется функция, в которой определяется логика преобразования регистра змеи. Эта функция отвечает за все преобразования верхнего регистра в нижний и заполнение промежутков между буквами символом подчеркивания (_). Затем эта функция вызывается для каждого элемента, присутствующего в массиве. Это рекурсивный метод проверки того, находятся ли элементы уже в змеином регистре или нет. Если они уже в змеином футляре, то он останется таким, как есть, иначе он будет преобразован в змеиный футляр и напечатан.

Пример 1. Этот пример иллюстрирует описанный выше подход к преобразованию всех ключей в регистр змеи в многомерном массиве.

PHP




<?php
  
// Input array
foreach ([
    "geek" => "geek",
    "Geek" => "Geek",
    "GeeksforGeeks" => "GeeksforGeeks",
    "Geeks4Geeks" => "Geeks4Geeks",
    "GeekGeekGeek" => "GeekGeekGeek",
    "geek_geek" => "geek_geek",
    "Geek4" => "Geek4",
    "It is Computer Science Portal" => "It is a Computer Science Website",
    "Technical Scripter 2022" => "Technical Scripter",
    ] as $case => $finalvalue) {
        $out = arrayInput($case);
    if ($out === $finalvalue) {
        echo "$case => [$finalvalue] ";
    } else {
        echo "$case => [$out] ";
    }
}
function arrayInput($in) {
    $logic = "!([A-Z][A-Z0-9]*(?=$|[A-Z][a-z0-9])|[A-Za-z][a-z0-9]+)!";
    preg_match_all($logic, $in, $similer);
    $x = $similer[0];
    foreach ($x as &$similer) {
        $similer = $similer == strtoupper($similer) ?
            strtolower($similer) :
            lcfirst($similer);
        }
    return implode("_", $x);
}
?>

Выход:

geek => [geek]
Geek => [geek]
GeeksforGeeks => [geeksfor_geeks]
Geeks4Geeks => [geeks4_geeks]
GeekGeekGeek => [geek_geek_geek]
geek_geek => [geek_geek]
Geek4 => [geek4]
It is Computer Science Portal => [it_is_computer_science_portal]
Technical Scripter 2022 => [technical_scripter]

Подход 2: во втором подходе определяется класс, в котором все значения массива объявляются как его объект. Здесь немного сложно, что все объекты должны быть объявлены. После этого из этих объектов будет сформирован входной массив. Наконец, объявлена одна функция для генерации ключей и добавления логики преобразования. Точно так же все значения будут проверены, а затем при необходимости преобразованы в случай змеи и распечатаны. Это объектно-ориентированный подход, при котором значения входного массива изначально рассматриваются как объекты. В выводе может быть какое-то предупреждение, но его можно просто игнорировать.

Пример 2: Этот пример иллюстрирует описанный выше подход к преобразованию всех ключей в регистр змеи в многомерном массиве.

PHP




<?php
class GFG {
    public $GeeksForGeeks;
    public $GFGevent;
}
class Events {
    public $TechnicalScripter2022;
    public $codingChallenge;
    public $SDEhiringEvent;
}
  
$GFG = new GFG();
$GFG->GeeksForGeeks = "GeeksForGeeks";
$GFG->GFGevent->TechnicalScripter2022 = "TechnicalScripter2022";
$GFG->GFGevent->codingChallenge = "codingChallenge";
$GFG->GFGevent->SDEhiringEvent= "SDEhiringEvent";
$arrtrasformed = arrayInput($GFG);
print_r($arrtrasformed);
  
function arrayInput($x){
  
    // Transforming array from an object
    $array = json_decode(json_encode((array) $x),true);
      
    // Transforming all array keys
    return keyTrans($array);
}    
  
function keyTrans($array) {
    foreach ($array as $key => $value){
      
        // Assuming array as keys and comparing values 
        unset($array[$key]); // Unsetting keys
  
        // Conversion logic
        $keyTrans = strtolower(preg_replace("/([a-z])([A-Z])/"
                                      "$1_$2", ltrim($key, "!")));
        $array[$keyTrans] = $value;  
        if (is_array($value)) {
            $array[$keyTrans] = keyTrans($value);
        }
    }
    return $array;
  }
?>

Выход:

PHP Warning:Creating default object from empty value in /home/main.php on line 16
Array
(
   [geeks_for_geeks] => GeeksForGeeks
   [gfgevent] => Array
       (
           [technical_scripter2022] => TechnicalScripter2022
           [coding_challenge] => codingChallenge
           [sdehiring_event] => SDEhiringEvent
       )
)