WordPress Geliştiricileri için Fonksiyonel PHP’ye Yumuşak Giriş: Dizi Gönderisinde Filtreler ve Haritalar Kullanma
Fred’in geçen hafta yazısı çeşitli yayınları filtrelemek ve bunları sıralamakla ilgiliydi. Dizi boyunca foraach yaptı ve daha sonra açık yorumlarla alfabetiğe dayalı yayınların bir listesini almak için USORT () PHP işlevini kullandı. JavaScript ekosistemi: fonksiyonel programlama özetinde kısaca bahsettiğim konu hakkında biraz düşünmemi sağladı. Fonksiyonel programlama, son yıllarda anlamaya başladığım en ilginç ve değerli şeylerden biridir. Bence fonksiyonel programlama son yıllarda anlamaya başladığım en ilginç ve değerli şeylerden biri. Bu herkes için değildir ve WordPress ile çalışmakla her zaman alakalı değildir. Ancak PHP’de dizileri işleme ve sıralama gibi şeyler yaparken (yine, Fred’in nasıl yapılacağı tarafından sunulan) daha özlü ve daha pürüzsüz bir şekilde parlıyor. Bu yüzden umudum, bu garip “anahtar kelimenin” teorisini daha fazla açıklarken, aynı zamanda kullanabileceğiniz gerçek ve pratik kullanım sağlar.
Foreach programlama paradigmasının kısa bir özeti, foreach çok “prosedürel” ile prosedürel filtreleme dizisidir. Yani: PHP çevirmenine tam olarak geçirilmesi gereken her adımı ve her aracı durumla ne yapılması gerektiğini açıklıyoruz. Loop Foreach PHP, programcıların erken yaşlardan beri öğrendikleri en yararlı şeylerden biridir. Etraflarındaki dil – “Bu listedeki her öğe için, içinde harekete geçin” – bunu anlamaya başlamak kolay, bugün tartışacağımız daha basit bir fonksiyonel programlama konseptinden biraz daha kolay. Somut bir tane almaya başlamak için yapacağız Fred’in makalesinden bazı kodları kopyalayın. Açık ve kapalı yorumlarla bir gönderi listesi yapmak istiyor ve şu şekilde yapmak istiyor: $ post_by_comment_status = array (); foreach ($ Post olarak $ gönder) {$ post_by_comment_status [$ post-> yorum_status] [] = $ yazı; } Sonuç, iki dizin açmış bir dizidir ve her dizinin altındaki posta satırı ile kapalıdır. Bu, bu sonucu oluşturmanın bir yolu olarak oldukça etkilidir. Bu aynı zamanda bunu yapmanın çok “prosedürel” bir yoludur. Yani: PHP çevirmenine tam olarak geçirilmesi gereken her adımı ve her aracı durumla ne yapılması gerektiğini açıklıyoruz. PHP’de paralelleştirme (bu görevi birçok farklı işlemle paralel olarak yapmak) mümkünse, burada gerçekleşmeyecektir, çünkü prosedürü bir çizgiden başka bir satırdan doğrusal bir yineleme olarak tanımladık.
Bu yöntem aynı zamanda foreach döngüsünün dışından, özellikle de döngüde kullanılan ve daha sonra kullanılan $ Posts_by_comment_status dizisine de dayanır. Bu şekilde, Loop Foreach’in “eylemi” dışarıda ne olduğunu bilmeye sahiptir. Bu, WordPress programlamasında yaygındır, ancak Foreach’taki eylemleri “statü” yapar, çünkü yaşadığı dünyayı bilir ve etkiler. Array_filter aynı temel hedeflere ulaşmak için işlevsel – Yorumları kapalı olan yorum_status açık ve diğer listeler oluşturan bir gönderi listesi oluşturun – Array_Filter PHP işlevine çağrılar kullanabiliriz. Yakında bant yardımı kodunu göstereceğim ve sonra yavaşlayarak açıklayacağız ve tüm bileşen kavramlarını açıklayacağız. $ Posts_with_closed_comments = array_filter ($ direkler, işlev ($ gönderiler) {return $ post-> yorum_status === ‘Kapalı’;}); $ post_with_open_comments = array_filter ($ gönderiler, işlev ($ gönderiler) {return $ post-> yorum_status === ‘open’;}); Şimdi bu kod sadece PHP 5.3’te ve üzerinde çalışıyor, ancak bu şekilde yazdım çünkü mevcut WordPress kodunun çoğu bu varsayımla iyi ve 5.2 ile uyumlu bir yolun ilk kez anlaşılması biraz daha zor. . (İhtiyaç duyanlar için, () {} işlevinin ayrı ayrı tanımlanan iki işlev adının argümanı olarak devam edeceğiz.
Bu örnekte ne yapıyoruz? Sadece istediğimiz öğelerle yeni bir dizi oluşturmak için diziyi filtreleme yeteneğini kullanıyoruz. Bu filtreleme nasıl olur? Array_filter () ‘e daha yakından bakalım. Nasıl array_filter () php’de çalışan array_filter iki argüman gerektirir (ve üç tane alabilir). Onlar: filtrelemek istediğiniz dizi öğeleri.
Filtreleme yapmak için kullanmak istediğiniz işlev. Bu işlev, filtre tarafından iletilmesi gereken değer için gerçek değeri ve silinmesi için yanlış döndürmelidir.
(İsteğe bağlı) Diziden çalışmaya kadar yalnızca anahtarları veya kilitleri ve değerleri devam ettirmek için bayraklar. Varsayılan, burada kullandığımız tek şey, yalnızca değeri devam ettirin.
Yani burada yalnızca kapalı yorumlarla bir dizi yayın alabiliriz Bir argüman olarak devam ederek, ‘kapalı’ dize değeri ile dize değeri (‘açık’ veya ‘kapalı’) arasındaki karşılaştırmanın sonuçlarını döndüren işlevler alabiliriz. Gönderi yorumlarının durumu. Yorum durumu ‘kapalı’ olan yayınlar, filtreleme ve kaydedilmiş işlevlerden True döndürülür. Yanlış dönmeyecekler ve atıldığı için. Daha sonra açık yorumları olanları yapmak için tam tersini yapabiliriz.
Her iki setin de sadece bir veya başka koşullarda değil, iki kez yapılması gerektiği varsayılırsa, usul yöntemleri için Array_Filter yapma ihtiyacı biraz zaferdir. Ama genellikle benim için foreach sadece birkaç küçük alt küme tutar ve bu Array_filter. Bu örnekte işlevsel olan nedir? Örneğimizle ilgili “işlevsel” temel şey, işlevi başka bir işlevle devam ettirmemizdir: Array_filter (). Bir kavram olarak “fonksiyonel” programlamayı bulduktan sonra insanlar tarafından yapılan yaygın bir hata, bu sadece işlevlere sahip olmakla ilgilidir. Şahsen, bu yanlış anlama nedeniyle “fonksiyonel programlamayı” serin ve yukarı doğru yapmak için bir yıldan fazla bir süre geçiriyorum. Örneğimizle ilgili “işlevsel” olan temel şey, sadece anahtar kelime işlevini kullanmamız değil (tüm WordPress programlama bunu yapmalıdır!), Ayrıca işlevi başka bir işleve devam ettiriyoruz: işlevsiz işlevden geçiyoruz ( Returns_tue_if_comment_is_open_open ()) gibi bir adınız var, ikinci argüman olarak bir Array_filter () haline gelin.
Dikkat edilmesi gereken başka bir şey, geçtiğimiz işlevin “vatansız” olmasıdır: diğer kodlar hakkında bilgi sahibi değildir ve buna ihtiyaç duymaz. Sadece bir giriş olarak bir $ posta nesnesi aldığını biliyordu ve sadece ne yapacağını belirlemek için nesneye ihtiyacı vardı. Bu şekilde işlevin “saf” veya “matematiksel” olduğu söylenir. (Aksine, “prosedürel” işlev neredeyse asla “vatandaşlık olmadan”: prosedür sadece dünya açıkça tanımlanmayan ve programcılar tarafından oluşturulması gereken bazı yapılandırmalarda olduğunda makul. Basit bir örnek Fred’in boş dizisi yapılmış Foreach.) Filtre () fonksiyonel programlamaya en iyi kapılardan biridir, çünkü işlevlerin çok küçük, çok kısa ve çok basit olabileceğini anlamaya başlamanızı gerektirir. Bu, birbirinizin işlevini sürdürdüğünüzde bu basit bağlılıktan alabileceğiniz etkileyici faydaları gösterir. WordPress’te çok yaygın olan prosedürel kod, 10-100 satır fonksiyonları ile işaretlenir. Filtre gibi bir şeyle bu alışkanlıktan başlamak için iyi bir yoldur. Filtre işlemi ve haritası haritası ile bir dizideki öğeyi değiştirmek, fonksiyonel programlamada bir kanon kapısıdır, bu nedenle haritayı açmam gerekir.
Filtre ve harita işlemleri fonksiyonel programlamada bir kanon kapısıdır, bu yüzden haritayı açmam gerekiyor.Bunu yapmak için, Fred’in bir yazı alma, filtreleme ve ardından alfabeye göre derleme fikrini öğrenmeye devam edebiliriz.Ancak basit kalmasını sağlamak için biraz hile yapacağım: Fred’in ekran görüntüleri sadece isimler gösteriyor – bağlantılar değil ve gerçek dünyada gerçek kullanımın ihtiyaç duyabileceği diğer posta verileri değil.Ancak, örneğin, bu basit ihtiyaç, hedeflerimize ulaşmak için Array_map () kullanmayı kolaylaştırır.Bu yüzden hile yapacağız.
FRED tarafından kullanılan kullanım işlevinin çok yararlı kullanımını kullanmadan alfabeye dayalı yayın başlıklarının bir listesini alacağız. (Bunu fark etmeyebilirsiniz, ancak () kullanma () ‘işlevseldir “: Vatansız işlevi başka bir işlev için bir argüman olarak devam ettirirsiniz.) Array_map () kullanacağız ve Sıra () PHP işlevi SORT () için çok basittir. Abjad’a göre başlık gönderisine göre. Array_map kullanma Bu, PHP’nin kaba tarafıdır: Array_filter ve Array_map karşısındaki parametrelerin sırasıdır. Array_filter dizinizi ve ardından işlevinizi beklediği yerde, Array_map işlevlerinizi ve ardından dizinizi istiyor. Bunu hatırlayarak, bunun gibi basit bir snippet ile sevkiyatın nöbetçisinden bir dizi gönderi yapabiliriz: $ list_of_titles = array_map (function ($ post) {return $ post-> post-> post_title;}, $ post); Bir kez daha, diğer işlevlerde işlem yapmak için küçük işlevler kullanıyoruz. Haritayı küçük bir işçi olarak görüyorum: Haritaya verdiğiniz işlevi listenize gönderiyorsunuz ve listenin her öğesini dönüştürüyor. Her öğenin eski değeri iki katına çıkardığı bir satır elde etmek için, eşleme işleviniz 2 $ 2 numaralı dönüş*2’nin basit bir dönüşü olacaktır; . Bizim için, her $ POST öğesini diziden alma işlevi ve bir post_title özelliği alır. Sonuç, aynı sıraya sahip bir dizidir, ancak yalnızca orijinal dizideki tüm nesnelerin yerine gönderimin başlığı ile. SORT () Kısa PHP sizin için alfabetik düzenleyebilir;
Sırp () yaptı. Sıra () bir dizi alır ve alfabe tarafından sıralanacak diziyi değiştirir. Dikkat edilmesi gereken bir şey, PHP’nin başka bir tuhaflığıdır: verdiğiniz şey (“yerinde”) ve sıraya girip getiremeyeceğine bağlı olarak doğru veya false geri yükleyin. Bu örnek sık sık yaşadığım sorunları vurgular: $ meyve = dizi (“limon”, “turuncu”, “muz”, “elma”); $ sorted_fruits = sıralı ($ meyve); Bunu ne üretir: Meyveler [0] = elma meyveleri [1] = muz meyveleri [2] = limon meyveleri [3] = turuncu sıralı_fruits = true sadece gotcha’ya dikkat edin çünkü $ sıralı_fruits kullanmaya devam ederseniz Çok sinirli çünkü sıraladığınız dizi değil. Değilse, sıralama oldukça basittir: diziyi alfabeye göre sıralama. Eşleme ve sıralamayı şimdi birleştirerek Array_map () ve Sort () ‘i anladıktan sonra, yalnızca alfabetik dizileri almak için ikisini birleştirmemiz gerekir: $ list_of_titles = array_map (function ($ post-> post_title; }, $ gönderiler, $ gönderiler); sıralama ($ list_of_titles);