Böyle özyinelemeli ebeveyn / çocuk sorunları nasıl ele?

4 Cevap php

Web dev ben bu sorunlar karşısında bir çok geliyor.

Örneğin, biz bu formatta URL'lerin dev bir listesi var:

/businesses  
/businesses/food  
/businesses/food/wendys  
/businesses/food/wendys/chili  
/businesses/food/wendys/fries  
/businesses/food/wendys/chicken-nuggets  
/businesses/pharmacy/cvs  
/businesses/pharmacy/cvs/toothpaste  
/businesses/pharmacy/cvs/toothpaste/brand  
...

ve sonra çıkış üst kategori h1 etiketleri her biri, ihtiyaç, çocuk h2 etiketleri ve H3 etiketleri olan çocukları.

Ben bu halledebilirim ama benim kod dağınık olduğunu hissediyorum. Ben kullanabileceğiniz bir tasarım modeli olduğundan emin değilim? Langs genellikle yakut / php vardır. bunu nasıl ele alabileceğinizi?

4 Cevap

Bu biraz sıkıştırılmış, ama mantıklı umuyoruz. Tabii ki ayarlamak için kriter bu olabilir o en optimum sonuç için.

s.each { |row|
  puts row[1..-1].split('/')[0..2].each_with_index \
  {|v,i| 
    tag = "h#{i+1}";
    print "<#{tag}>#{v}</#{tag}> "
  }
}

Daha ayrıntılı

s.each do |row|                             # 'each' will split each row
  row = row[1..-1]                          # string of the row without '/'
  words = row.split('/')                    # split into words
  words = words[0..2]                       # we just need first 3 tags
  words.each_with_index do |word, index|    # get index and value of each element in word array
    tag = "h#{index+1}"                       # use index to dynamically generate tag
    print "<#{tag}>#{word}</#{tag}> "       # use the tag and word to generate output
  end
end

Sen gerekir

  1. Uygun bir yerde bir kütüphane yöntemi koymak
  2. Bir dizideki değerleri toplamak
  3. döngü görünümünde dizi üzerinden ve etiketleri oluşturmak

Sonra konum ama ben bu yönde başlamak istiyorum çözümün tam olarak emin değil ne tür, ilk url liste dışında bir ağaç yapacak:

s = '/businesses  
/businesses/food  
/businesses/food/wendys  
/businesses/food/wendys/chili  
/businesses/food/wendys/fries  
/businesses/food/wendys/chicken-nuggets  
/businesses/pharmacy/cvs  
/businesses/pharmacy/cvs/toothpaste  
/businesses/pharmacy/cvs/toothpaste/brand'
h = {}
s.split("\n").map(&:strip).each do |row|
  lh = h
  row[1..-1].split('/').each do |item|
    lh[item] ||= {}
    lh = lh[item]
  end
end

ve ardından etiketleri> H3 kullanarak değil, ardışık yazdırın:

def rprint h, level=1
  h.each do |k,v|
    puts "<li><h#{level}>#{k}</h#{level}>"
    unless v.empty?
      puts "<ul>"
      rprint(v, level == 3 ? 3 : level + 1)
      puts "</ul>"
    end
    puts "</li>"
  end
end

rprint h

Tabii ki, bu baskı mantık iyi çiftleşmiş dilini kullanarak yerine bu gibi HTML beste, bir görünüm için gitmek istiyorum, ama fikir aynı olmalıdır.

Bu tabii ki biraz daha sevgi ihtiyacı, ama belki de başlamış olur:

>> path = "/businesses/pharmacy/cvs/toothpaste/brand" 
>> path.split('/',4)[1..-1].each_with_index { |el,i| puts "<h#{i+1}>#{el}</h#{i+1}>" }
<h1>businesses</h1>
<h2>pharmacy</h2>
<h3>cvs/toothpaste/brand</h3>

edit: Burada aklınıza başka bir yol:

>> [*0..2].zip(path.split('/',4).drop(1)).each { |i,el| puts "<h#{i}>#{el}</h#{i}>" }