Необходимо создать древовидную структуру массива строк с разделителем - PullRequest
0 голосов
/ 10 октября 2018

Мне нужно сделать преобразование массива строк, который представляет собой список, разделенный на "/".

В основном мне нужно это:

[
    "label1/label12/label13/label14",
    "label1/label12/label15",
    "label1/label12/label16",
    "label7/label72/label73"
]

, чтобы получить вот так:

{
    "label1": {
        "label12": {
            "label13": "label14",
            "label15",
            "label16"
        }
    },
    "label7": {
        "label72": "label73"
    }
}

Возможно ли это каким-либо образом?

Редактировать: После того, как Дрю дал решение моей проблемы, как я уже писал, мне теперь нужен способ даже сделатьс такими клавишами, как «+++ В работе +++»

Edit2: Второе решение работает еще лучше.Спасибо, ребята!

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Этот метод также работает с клавишами со специальными символами, такими как "+" или "!"или "+++ В работе +++"

<Cfset labels =[
    "label1/label12/label+++13/+++ In work +++",
    "label1/label12/label15",
    "label1/label12$$@!/label16",
    "123/label72/label73"
]>


<cffunction name="convertLabels" returntype="struct">
    <cfargument name="k" type="array">
    <Cfset var local = {}>
    <Cfset local.response = {}>

    <Cfloop from=1 to="#arraylen(arguments.k)#" index="i">
        <Cfset local.splitted = arguments.k[i].Split("/")>
        <cfset local.refPath = local.response>
        <Cfloop from=1 to="#arraylen(local.splitted)#" index="local.y">
            <cfif not structKeyExists(local.refPath,local.splitted[local.y])>
                <Cfset local.refPath[splitted[local.y]] = {}>
            </cfif>
            <Cfset local.refPath = local.refPath[local.splitted[local.y]]>
        </cfloop>
    </cfloop>

    <cfreturn local.response>
</cffunction>
<cfdump var="#convertLabels(labels)#">
0 голосов
/ 10 октября 2018
<cfset arrLabels = [
    "label1/label12/label13/label14",
    "label1/label12/label15",
    "label1/label12/label16",
    "label7/label72/label73"
]>




<cffunction name="labelConversion" returntype="struct">
    <cfargument name="arrLabels" type="array">
    <cfset var structLabels = {} />

    <cfloop from="1" to="#ArrayLen(arguments.arrLabels)#" index="i">
        <cfset StructGet("structLabels."&replace(arguments.arrLabels[i],'/','.', 'all'))>
    </cfloop>

    <cfreturn structLabels />
</cffunction>


<cfdump var="#labelConversion(arrLabels)#">
<cfabort>
...