PHP intval() işlevi: tamsayıya dönüştürün. PHP Veri Türü Manipülasyonu

  • 18.05.2019

PHP, bir değişken bildirirken açık bir tür bildirimi gerektirmez (ve desteklemez); Bir değişkenin türü, kullanıldığı bağlama göre belirlenir. Yani, $var öğesine bir dize değeri atarsanız, $var bir dize olur. Daha sonra $var'a bir tamsayı değeri atarsanız, bu bir tamsayı olur.

Otomatik tür dönüştürmeye bir örnek, toplama operatörüdür " + ". İşlenenlerden herhangi biri bir kayan noktalı sayı ise, tüm işlenenler kayan noktalı sayılar olarak yorumlanır, sonuç da bir kayan noktalı sayı olacaktır. Aksi takdirde, işlenenler tamsayı olarak yorumlanacak ve sonuç da bir tamsayı olacaktır. Bunun işlenenlerin türlerini DEĞİŞTİRMEYECEĞİNİ, yalnızca nasıl hesaplandıklarını değiştirdiğini unutmayın. Bazı pratik örnekler:

$foo = "0" ; // $foo bir dizgedir (ASCII 48)
$foo += 2 ; // $foo artık bir tam sayıdır (2)
$foo = $foo + 1.3 ; // $foo artık bir kayan nokta (3.3)
$foo = 5 + "10 Küçük Domuzcuk" ; // $foo bir tamsayıdır (15)
$foo = 5 + "10 Küçük Domuz" ; // $foo bir tamsayıdır (15)
?>

Bu bölümdeki örneklerden herhangi birini test etmek isterseniz, işlevi kullanabilirsiniz. var_dump() .

Dikkat: -1 sayar DOĞRU, sıfır olmayan (negatif veya pozitif) herhangi bir sayı gibi!

Dönüşüm örnekleri:

var_dump((bool) "" ); // bool(yanlış)
var_dump((bool) 1 ); // bool(doğru)
var_dump ((bool) - 2 ); // bool(doğru)
var_dump((bool) "foo" ); // bool(doğru)
var_dump((bool) 2.3e5 ); // bool(doğru)
var_dump ((bool) dizi(12)); // bool(doğru)
var_dump((bool)array()); // bool(yanlış)
var_dump((bool) "yanlış"); // bool(doğru)
?>

Boole türünden dönüştürme

YANLIŞ 0'a (sıfır) dönüştürülür ve DOĞRU- 1'de (bir).

Float türünden dönüştürme

Kayan nokta sayısından tam sayıya dönüştürülürken sayı yuvarlanır sıfıra doğru.

Float tamsayının sınırlarını aşarsa (genellikle +/- 2.15e+9 = 2^31), tamsayı doğru sonucu döndürmek için yeterli kesinliğe sahip olmadığından sonuç tanımsız olacaktır. Bu durumda, hiçbir uyarı veya hatta açıklama görüntülenmez.

Dikkat! Bilinmeyen bir kesri asla bir tam sayıya dönüştürmeyin, çünkü bu bazen beklenmedik sonuçlar verebilir, örneğin:

echo (int) ((0.1 + 0.7 ) * 10 ); // 7 çıktısı!
?>

Dize türünden dönüştürme

Diğer türlerden dönüşümler

Diğer türler için tamsayıya dönüştürme davranışı tanımsızdır. Şu anda davranış, değer first . Yine de olumsuzluk haber verilmeksizin değişebileceğinden bu davranışa güvenin.

boole ( boole) anlam DOĞRU"1" dizgisine ve değere dönüştürülür YANLIŞ"" (boş dize) olarak temsil edilir. Bu şekilde, değerleri her iki yönde de - boole türünden dize türüne veya tam tersine dönüştürebilirsiniz.

tamsayı ( tam sayı) veya kayan nokta sayısı ( batmadan yüzmek) basamaklarından oluşan bir sayı ile temsil edilen bir dizgeye dönüştürülür (kayan noktalı sayıların üssü dahil).

Diziler her zaman "Array" dizesine dönüştürülür, bu nedenle bir dizinin içeriğini görüntüleyemezsiniz ( dizi) kullanarak Eko() veya Yazdır() ne içerdiğini görmek için Tek bir öğeyi görüntülemek için echo $arr["foo"] gibi bir şey yapmanız gerekir. Tüm içeriğin nasıl görüntüleneceği/görüntüleneceği ile ilgili ipuçları için aşağıya bakın.

Nesneler her zaman "Object" dizesine dönüştürülür. Bir nesne üye değişkeninin değerini çıktılamak istiyorsanız ( nesne) hata ayıklama amacıyla aşağıdaki paragrafları okuyun. Gerekli nesnenin sınıf adını almak istiyorsanız, şunu kullanın: get_class() .

Kaynaklar her zaman "Kaynak kimliği #1" yapısıyla dizelere dönüştürülür, burada 1 benzersiz bir kaynak numarasıdır ( kaynak) çalışma zamanında PHP tarafından kendisine atanır. Kaynak türünü almak istiyorsanız, .

HÜKÜMSÜZ her zaman boş dizeye dönüştürülür.

Dizilerin, nesnelerin veya kaynakların çıktısı, değerlerin kendileri hakkında size herhangi bir yararlı bilgi sağlamaz. Hata ayıklama için değerlerin çıktısını almanın daha uygun bir yolu, işlevleri kullanmaktır. print_r() ve var_dump() .

Kalıcı depolama için PHP değerlerini dizelere de dönüştürebilirsiniz. Bu yöntem serileştirme olarak adlandırılır ve işlevle yapılabilir. seri hale getir(). Ayrıca PHP kurulumunuz WDDX desteğine sahipse PHP değerlerini XML yapılarına seri hale getirebilirsiniz.

Dizi tipine dönüştür (diziler)

Türlerden herhangi biri için: tam sayı, batmadan yüzmek, sicim, boole ve kaynak, değeri bir diziye dönüştürürseniz, bir eleman (0 dizininde) ile başladığınız skaler değer olan bir diziyle sonuçlanırsınız.

Bir nesneyi diziye dönüştürürseniz ( nesne), bu nesnenin özelliklerini (üye değişkenleri) dizi öğeleri olarak alacaksınız. Anahtarlar, üye değişkenlerin adları olacaktır.

Değeri bir diziye dönüştürürseniz HÜKÜMSÜZ, boş bir dizi alacaksınız.

Object (nesneler) türüne dönüştür

Bir nesne bir nesneye dönüştürülürse değişmez. Başka türden bir değer bir nesneye dönüştürülürse, yerleşik sınıf stdClass'ın yeni bir örneği oluşturulur. Değer boşsa, yeni örnek de boş olacaktır. Başka herhangi bir değer, onu skaler üye değişkeninde içerecektir:

$nesne = (nesne) "ciao";
echo $nesne -> skaler ; // "ciao" çıktısı
?>

Bilgi her zaman sembolik olmuştur. Yalnızca programlama ortaya çıktığında kısmen harflere, sayılara ve işaretlere (resmi anlamda) dönüştü.

Belli bir zamana kadar sözlü konuşma, el yapımı semboller, jestler ve özellikle sanat eserleri en büyük popülariteye sahipti. Küçükten büyüğe bilginin doğal sunumu için tüm bu seçeneklerin her zaman kelimelerle açıklanabilmesi, yani bir anlamda yazılım işlemeye açık olması önemlidir.

Dizeler ve sayılar

Çizgiler, her şeyden önce, çeşitli karakterlerin koleksiyonlarıdır. Farklı programlama araçlarında, kesirli kısım tam sayıdan farklı şekillerde ayrıldı. Bazıları noktayı tercih ederken, diğerleri virgül (PHP'de bir dizeyi sayıya dönüştürmek "." anlamına gelir). Triad'lar tek bir kesme işareti, virgül veya boşluk ile ayrıldı. Gerçek sayılar "E" harfi ile yazılmıştır.

Bütün bunlar formalite. Herhangi bir işlemcinin matematiği ve çalışma prensipleri her zaman sayıları sade olarak kabul etmiştir ve bunlara karşılık gelen ek işlemciler gerçek değerlerle çalışmak üzere geliştirilmiştir.

Ancak somut tür değişkenleri dünyası (erken dönem programları için) ve tüm veri türlerinin modern fikir birliği, PHP'de bir dizeyi sayıya dönüştürmenin hiçbir şey yapmamak gibi olduğu anlamına gelir. En iyi durumda, PHP kaynak dizede en az bir basamak varsa "keser" veya daha doğrusu 0 veya sayı yapar. İlk rakam olmayan karaktere kadar olan tüm rakamlar bu numarayı oluşturacaktır.

Genel dönüştürme kuralı

PHP'de, programcı aksini belirtmedikçe, bir dizgenin bir sayıya dönüştürülmesi, uygulama sırasında otomatik olarak gerçekleşir. Değişken yalnızca rakamlar ve bir nokta içeriyorsa, gerçek bir sayı elde edilebilir. Bir basamak dizisinde virgül varsa, ondan önce gelen her şey doğal olarak bir tam sayı olarak yorumlanacaktır.

Rakam dizisindeki herhangi bir sayısal olmayan karakter işlemi durdurur ve PHP'nin "dizeden sayıya" dönüşümünün sonucu, yalnızca sayısal olmayan ilk karakterden önce oluşturulan değer olacaktır.

Matematik ve sembol işleme

Daha zor olan, birinci veya ikinci, sayfaya sığmayan formüller açısından bile, etkileyici matrisler, grafikler, bazen integrallerin türevlerinin yazarları, n'inci nesildeki integrallerden ve polinomlardan türevler bile çözemezler. , söylemek çok basit: toplum elbette matematiğin ve matematikçilerin erdemlerini onurlandırır, ancak sembol işleme daha önemlidir, daha karmaşıktır ve matematiği bir yorgan gibi kaplar, sayıların büyüsünün ötesine geçemeyen meraklı bir zihin sağlar, yaratıcılık için uygun bir ortam.

Genellikle açık PHP, dizeyi otomatik olarak sayıya dönüştürür, ancak kontrol etmek asla kötü bir fikir değildir. PHP'nin belirli bir değişkenin bir sayı olduğunu doğru bir şekilde anladığından her zaman emin olmak en iyisidir. En ufak bir şüphe bile varsa, değerden önce (int) veya (float) değişkeninin türünü açıkça belirtmeli ve is_integer() veya is_float() işlevleriyle PHP'nin değişkenin türünü nasıl anladığını kontrol etmelisiniz.

Modern Programlama Trendleri

PHP'deki "diziden sayıya" görevinin klasik yorumu, modern programlama fikirlerinin sınırları içindedir. Ters işlem çok daha çeşitli seçeneklere sahiptir. Fonksiyonlar number_format(), printf(), sprintf() sadece tek bir sayı düzeyinde değil, aynı zamanda bir grup sayı düzeyinde de harikalar yaratabilir.

PHP'de Dönüşüm" string to number", bunun yerine bunu yapabileceğimizi belirtir, ancak m atematik ve sayısal hesaplamalar bizim işimiz değil.

PHP'de şu veya bu sayı işlemeyi uygulayan düzgün ve güvenilir işlevsellik yazmak sorun değildir ve sonuç, daha fazla matematik dilinden elde edilen sonuçtan daha kötü olmayacaktır. PHP, her şeyden önce, bir sunucu dili, matematiksel olanlar da dahil olmak üzere bilgi işleme dilidir.

Tam sayıların gerçek sayılara göre önceliği yoktur, ancak büyük ölçüde “dijital olmayan” bir amaç için yönlendirilirler. Belirli sayıda basamaklı ve/veya belirli bir değer aralığındaki kesin bir sayı, CSS kuralları oluşturmak için anlamlıdır, bir dizi anahtarı veya bir veritabanı tablosu satırı için benzersiz bir kayıt kodu olarak kullanılabilir. Tam sayı, veri iletirken benzersiz bir kodun, bir parolanın veya bir sağlama toplamının parçası olabilir. Bir tamsayı matematikten ve sayısal yöntemlerden uzaktır, genellikle verilen veya kodunun bir öğesidir.

intval() fonksiyonunun anlamı

PHP'nin intval() işlevi "değişkeni tamsayıya" dönüştürmek için kullanılır, iki parametresi ve çift anlamı vardır.

İkinci parametre istenen sayı sisteminin temelidir. Ondalık sistem varsayılan olarak kullanılır. İkinci parametreyi belirtmezseniz, "0" karakteriyle başlayan sayı sekizlik ve "0x" - onaltılık karakterleriyle başlayan sayı olarak kabul edilir.

Birinci parametre bir karakter dizisiyse, ikinci parametre önemlidir.

Son iki örnek (çok büyük değerler) sonucun uygun olmadığını göstermektedir. Esasen, makinenin (işletim sistemi) bit derinliği burada önemlidir. Pratikte, bu tür sayıların dönüşümleri pek bir anlam ifade etmez.

PHP'nin intval işlevinin arkasındaki mantık, pratik kullanım için bir dize veya sayıyı bir tam sayıya dönüştürmektir. Örneğin, yalnızca tamsayıları kullanan bir CSS kuralı oluşturun. Yalnızca tamsayı kısmını kaldırarak gerçek bir sayıyı tam sayıya dönüştürün.

intval() işlevini kullanma

PHP'nin intval() işlevi, bir tamsayı elde etme amacına yönelik tek işlev değildir. round(), ceil() ve floor() kullanabilirsiniz. Bu işlevler ortak yuvarlama mantığıyla çalışır.

PHP'nin intval() işlevi herhangi bir mantıktan yoksundur ve bir tamsayı alma ilkesine göre çalışır. Gerekirse, istenen sayı sistemine göre istenen tabana göre.

Yukarıda gösterilen intval() PHP örnekleri, ana uygulama alanının hesaplamaların mantığı değil, algoritmanın mantığı olduğunu göstermektedir.

Bu işlev, bir HTML sayfasını doğru bir şekilde görüntülemek (parametrelerde CSS kurallarını ve HTML etiketlerini kullanarak) ve dizi anahtarları, veritabanı tabloları satırları, numaralandırma eylemleri, sayma olayları oluşturmak için veri oluşturmak için ideal bir araçtır.

Dünyanın her yerinden müşterilere dokunan bir uygulamam var ve doğal olarak veritabanlarıma giren her şeyin UTF-8 kodlu olmasını istiyorum.

Benim için asıl sorun, herhangi bir dizenin kaynak kodlamasının ne olacağını bilmememdir - bir metin alanından olabilir (kullanarak

yalnızca kullanıcı formu gerçekten gönderdiyse yararlıdır) veya yüklenen bir metin dosyasından olabilir, bu nedenle giriş üzerinde gerçekten hiçbir kontrolüm yok.

Veritabanıma gelen şeylerin mümkün olduğunca UTF-8 kodlaması olmasını sağlayan bir işleve veya sınıfa ihtiyacım var. iconv(mb_detect_encoding($text), "UTF-8", $text); denedim ancak bunun sorunları var (giriş "nişanlısı" ise, "nişanlısı" döndürür). çok şey denedim =/

Dosya yüklemeleri için, son kullanıcıdan kullandıkları kodlamayı belirtmesini isteme ve onlara çıktının nasıl görüneceğine dair bir önizleme gösterme fikrini seviyorum, ancak bu, kötü niyetli bilgisayar korsanlarına karşı yardımcı olmuyor (aslında, hayatlarını biraz daha kolaylaştırabilir).

Konuyla ilgili diğer SO soruları okudum, ancak "RSS beslemelerini ayrıştırmam gerekiyor" veya "Web sitelerinden veri siliyorum" (veya gerçekten "Yapamazsınız") gibi ince farkları var gibi görünüyor.

Ama en azından iyi deneyen bir şey olmalı!

9 yanıt

İstediğiniz şey son derece karmaşık. Mümkünse, kullanıcı kodlamasını ayarlamak en iyisidir. Bir saldırıyı önlemek çok daha kolay veya daha zor olmak zorunda değildir.

Ancak şunları deneyebilirsiniz:

Iconv(mb_detect_encoding($metin, mb_detect_order(), true), "UTF-8", $metin);

Kesin bir değere ayarlamak daha iyi bir sonuç almanıza yardımcı olabilir.

Rusya'nın anavatanında 4 popüler kodlamamız var, bu yüzden sorunuz burada yüksek talep görüyor.

Yalnızca karakter karakter kodlarıyla, kod sayfaları çakıştığı için kodlamayı algılayamazsınız. Farklı dillerdeki bazı kod sayfalarının tam kesişimi bile vardır. Yani, farklı bir yaklaşıma ihtiyacımız var.

Bilinmeyen kodlamalarla çalışmanın tek yolu olasılıklarla çalışmaktır. Yani "bu metnin kodlaması nedir?" sorusuna cevap vermek istemiyoruz, anlamaya çalışıyoruz" Bu metnin en olası kodlaması nedir?".

Popüler bir Rus teknoloji blogundan bir adam bu yaklaşımı ortaya attı:

Desteklemek istediğiniz her kodlamada bir dizi karakter kodu oluşturun. Kendi dilinizdeki bazı büyük metinleri kullanarak oluşturabilirsiniz (bazı kurgu gibi, İngilizce için Shakespeare ve Rusça için Tolstoy kullanın, lol). Bunun gibi bir şey alacaksınız:

Kodlama_1: 190 => 0.095249209893009, 222 => 0.095249209893009, ... encoding_2: 239 => 0.095249209893009, 207 => 0.095249209893009, ... kodlama_N: karakter kodu => olasılık

Daha öte. Metni bilinmeyen bir kodlamayla alırsınız ve "olasılık sözlüğünüzdeki" her bir kodlama için, bilinmeyen bir kodlamayla metindeki her karakterin sıklığını ararsınız. Sembollerin toplam olasılığı. En yüksek puan alan kodlama muhtemelen kazanandır. Büyük metinler için en iyi sonuçlar.

Eğer ilgini çektiyse Bu görevde size seve seve yardımcı olabilirim. 2 karakterlik bir olasılık listesi oluşturarak doğruluğu büyük ölçüde iyileştirebiliriz.

btw. mb_detect_encoding kesinlikle çalışmıyor. Evet, genel olarak. Lütfen "ext/mbstring/libmbfl/mbfl/mbfl_ident.c" içindeki mb_detect_encoding için kaynak koduna bakın.

Muhtemelen bunu denemişsinizdir, ancak neden sadece mb_convert_encoding işlevini kullanmıyorsunuz? Sağlanan metnin karakter kümesini otomatik olarak belirlemeye çalışacak veya bir liste iletebilirsiniz.

Ayrıca, çalıştırmayı denedim:

$metin = "nişanlısı"; echo mb_convert_encoding($metin, "UTF-8"); Eko "

"; echo iconv(mb_detect_encoding($metin), "UTF-8", $metin);

ve sonuçlar her ikisi için de aynıdır. Metninizin "nişanlı" olarak kısaltıldığını nasıl görüyorsunuz? veritabanında mı yoksa tarayıcıda mı?

Tamamen doğru olan bir dize kodlamasını tanımlamanın bir yolu yoktur. Kodlamayı tahmin etmeye çalışmanın yolları vardır. Bu yollardan biri ve muhtemelen/şu anda PHP'deki en iyisi mb_detect_encoding()'dir. Bu, dizinizi tarar ve belirli kodlamalara özgü şeylerin oluşumlarını arar. Dizinize bağlı olarak, bu kadar farklı durumlar olmayabilir.

ISO-8859-1 ve ISO-8859-15 kodlamasını alın (http://en.wikipedia.org/wiki/ISO/IEC_8859-15#Changes_from_ISO-8859-1)

Yalnızca birkaç farklı karakter var ve onları daha da kötüleştirmek için aynı baytlarla temsil ediliyorlardı. Kodlamasını bilmeden bir dize verildiğinde, bayt 0xA4'ün dizenizde ¤ veya €'yu temsil edip etmeyeceğini öğrenmenin bir yolu yoktur, bu nedenle tam kodlamasını bilmenin bir yolu yoktur.

(Not: Bir köprü gibi görünse de, çevredeki bağlama dayalı olarak, karakterin ¤ veya € olması gerekip gerekmediğini anlamak için bir insan faktörü veya daha gelişmiş bir tarama yöntemi (Oroboros102'nin önerdiği gibi) ekleyebilirsiniz. uzak)

Örneğin, UTF-8 ve ISO-8859-1 arasında daha ayırt edilebilir farklar vardır, bu nedenle, doğru olduğuna güvenip güvenmemeniz gerekse de, emin olmadığınızda onu anlamaya çalışmakta fayda var.

Doğru kodlamayı sağlamanın başka yolları da vardır. Formlar için UTF-8'i mümkün olduğunca zorlamaya çalışın (her tarayıcıda UTF-8'i temsil ettiğinizden emin olmak için kardan adamı kontrol edin: http://intertwingly.net/blog/2010/07/29/Rails- ve-Kardan Adamlar) Bu, en azından formlarınız aracılığıyla gönderilen her metnin utf_8 olduğundan emin olmanız için yapılır. Yüklenen dosyalarla ilgili olarak, üzerinde "file -i" unix komutunu çalıştırmayı deneyin, ör. exec() (mümkünse sunucunuzda) keşfetmeye yardımcı olmak için (belge özelliklerini kullanarak). Verileri kazımaya gelince, genellikle kodlamayı belirleyen HTTP başlıklarını okuyabilirsiniz. XML dosyalarını ayrıştırırken, XML meta verilerinin bir karakter kümesi tanımı içerip içermediğine bakın.

Kodlamayı otomatik olarak tahmin etmeye çalışmak yerine, tespite başvurmadan önce, mümkünse önce belirli bir kodlamayı kendiniz sağlamaya çalışmalı veya (varsa) tanımı aldığınız kaynaktan almaya çalışmalısınız.

Benim için asıl sorun, herhangi bir dizenin kaynak kodlamasının ne olacağını bilmememdir - bir metin alanından olabilir (kullanıcı yalnızca formu gerçekten gönderdiyse kullanım yararlıdır) veya yüklenen bir dosyadan olabilir. metin dosyası, bu yüzden giriş üzerinde gerçekten hiçbir kontrolüm yok.

Bunun bir sorun olduğunu düşünmüyorum. Uygulama giriş kaynağını biliyor. Bir formdan geliyorsa, durumunuzda UTF-8 kodlamasını kullanın. İşe yarıyor. Sağlanan verilerin doğru şekilde kodlandığından emin olun (doğrulama). Tüm veritabanlarının UTF-8'i tam olarak desteklemediğini unutmayın.

Bu bir dosyaysa, onu veritabanında UTF-8 kodlamasında değil, ikili biçimde kaydedersiniz. Dosyanın çıktısını tekrar aldığınızda, ikili çıktıyı da kullanın, o zaman tamamen şeffaf olur.

Fikriniz, kullanıcının dosyayı yükledikten sonra ikili olduğu için hala söyleyebiliyorsa, kodlamayı söyleyebilmesi iyidir.

Bu yüzden, sorunuzla gündeme getirdiğiniz belirli sorunu görmediğimi itiraf etmeliyim. Ama belki sorununuzla ilgili birkaç ayrıntı ekleyebilirsiniz.

Grim, burada gerçekten iyi cevaplar ve sorunuzu cevaplamaya yönelik girişimler var. Herkese cevapları için teşekkür etmek istiyorum. Onlar büyük. Ben bir kodlama sihirbazı değilim, ancak veritabanınızda temiz bir UTF-8 yığınına sahip olma arzunuzu anlıyorum. Tablolar, alanlar ve bağlantılar için MySQL utf8mb4 kullanıyorum.

Durumum, "Veriler HTML formlarından veya e-posta kayıt bağlantılarından geldiğinde UTF-8'i işlemek için yalnızca dezenfektanlarımın, doğrulayıcılarımın, iş mantığımın ve hazırlanmış ifadelerin olmasını istiyorum." Sanırım bu fikirle başladım:

  • Kodlama algılama girişimi: $encodings = ["UTF-8", "ISO-8859-1", "ASCII"];
  • Kodlama bulunamazsa, yeni RuntimeException'ı atın
  • Giriş UTF-8 ise devam edin.
  • Aksi takdirde, ISO-8859-1 veya ASCII ise

    a. UTF-8'e dönüştürme girişimi (beklemede, tamamlanmadı)

    b. Dönüştürülen değerin kodlamasını belirleyin

    İle birlikte. Bildirilen kodlanmış ve dönüştürülmüş değer UTF-8 ise, devam edin.

    e. Aksi takdirde, yeni RuntimeException'ı atın

Sanitizer soyut sınıfımdan

Özel işlev isUTF8($kodlama, $değer) ( dönüş (($encoding === "UTF-8") && (utf8_encode(utf8_decode($değer)) === $değer)); ) özel işlev utf8tify( &$ değeri) ( $encodings = ["UTF-8", "ISO-8859-1", "ASCII"]; mb_internal_encoding("UTF-8"); mb_substitute_character(0xfffd); //DEĞİŞİM KARAKTER mb_detect_order( $encodings); $stringEncoding = mb_detect_encoding($value, $encodings, true); if (!$stringEncoding) ( $değer = null; throw new \RuntimeException("Temizleyicide karakter kodlaması tanımlanamadı."); ) if ( $this-> isUTF8($stringEncoding, $değer)) ( dönüş; ) else ( $değer = mb_convert_encoding($değer, "UTF-8", $stringEncoding); $stringEncoding = mb_detect_encoding($değer, $kodlamalar, true) ; if ($ this->isUTF8($stringEncoding, $değer)) ( dönüş; ) else ( $değer = null; throw new \RuntimeException("ISO-8859-1 veya ASCII'den karakter kodlaması UTF'ye dönüştürülemiyor -8 dezenfektan içinde."); ) ) dönüş; )

Kodlama endişelerini soyut Sanitizer sınıfımdan ayırmam ve Encoder nesnesini Sanitizer'ın somut bir alt örneğine enjekte etmem gerektiği iddia edilebilir. Ancak, yaklaşımımdaki asıl sorun şu ki, hiçbir bilgim olmadan ihtiyacım olmayan kodlama türlerini reddediyorum (ve PHP'nin mb_* işlevlerine güveniyorum). Daha fazla araştırma yapmadan, bazı insanlara zarar verip vermediğini (veya önemli bilgileri kaçırıp kaçırmadığımı) bilemem. Bu yüzden daha fazlasını bilmem gerekiyor. Bu makaleyi buldum.

Çeşitli programlama görevleri arasında tarih ve saat değerlerine sahip çeşitli manipülasyonlar oldukça yaygındır. Nadir bir otomatik sistem, bir veritabanı, belirli bir sürecin zamanı hakkında bilgi depolamadan yapabilir. Bir veritabanı kaydına basit bir tarih ekleme veya bu tarihi görüntülemenin yanı sıra, bu tarihleri ​​çeşitli şekillerde görüntüleme, mevcut saatin belirli bir zamanlayıcıyla eşleşip eşleşmediğini kontrol etme, iki tarih arasındaki süreyi hesaplama ve çok daha fazlası gibi birçok görev vardır. .

Tarihlerle çalışmanın rahatlığı için, her programlama dilinin tarih ve saat değerlerini saklamak için kendi özel veri türleri vardır. Çoğu zaman bu, bir tamsayı veya kayan nokta değeri olan sayısal bir değerdir.

PHP'de tarihlerle çalışmak en sık UNIX TIMESTAMP ile karşılaşır. Burada zaman bir tamsayı olarak saklanır. Zamanın hesaplanması 1 Ocak 1970'de başlar. Bu nedenle, örneğin, 12/11/2014 7:40:00 PM tarih ve saati 1418316000 sayısı ile temsil edilecektir.Bu şekil, Unix Epoch olarak adlandırılan 1 Ocak 1970 sıfır tarihinden bu yana kaç saniye geçtiğini gösterir. .

Veri dönüştürme yetenekleri sağlayan bir php sayfası örneği, sitede "Tarih ve saat biçimi dönüştürme" programı tarafından programlar bölümünde sunulmaktadır. Burada istediğiniz tarihi UNIX TIMESTAMP formatında oluşturabilir ve bu formatı standart, insan tarafından okunabilir bir forma getirebilirsiniz.

PHP'de geçerli saat ve tarihi alma

Geçerli sunucu saatini almak için işlevi kullanın

int zaman(void)

bu sadece değeri unix zaman damgası biçiminde döndürür.

ekozaman(); // geçerli saati unix zaman damgası biçiminde göster

İlk bakışta, bu bir kişi için çok uygun bir format değildir, ancak bildiğiniz gibi, veri gösterimi ne kadar basit olursa, bu değerlerin bir bilgisayar tarafından işlenmesi o kadar hızlı olur. Ayrıca, bir sayıyı bir veritabanında saklamak, herhangi bir özel formattan çok daha ekonomiktir. Ayrıca PHP zaman içinde hem Unix hem de Windows platformlarında aynı şekilde çalışır, bu da kodun bu platformlardan herhangi birinde kullanılmasını mümkün kılar.

PHP tarih saat biçimi dönüştürme

Sayısal bir tarih değerini daha okunabilir değerlere dönüştürmek için en basit mekanizma, işlev tarafından sağlanır:

dizi getdate()

Tarih bilgisini içeren bir ilişkisel dizi döndürür. Zaman damgası parametresi belirtilmezse, geçerli zaman bilgisi döndürülür. Bu dizi aşağıdaki değerleri içerir:

Ortaya çıkan dizi, değerleri istenen biçimde görüntülemenizi sağlar:

$tarih = 1418372345;
$date_mas = getdate($tarih);
echo $tarih_mas["gün"] . ". " $date_mas["mon" ] . ". " $tarih_mas["yıl"]; // 12.12.2014


Bu işlevi tarih ve saat biçimini dönüştürmek için de kullanabilirsiniz:

string tarih(string $şablon [, int $unix_timestamp])

Geçerli tarih unix zaman damgasını istenen biçimde almak için tasarlanmıştır. $template string parametresi çıktı formatını belirtir. $unix_timestamp parametresi ile hangi zaman değeriyle çalışılacağını belirleyebilirsiniz. İsteğe bağlıdır, bu nedenle belirtmezseniz geçerli tarih ve saat kullanılacaktır.

Biçim aşağıdaki değerlerle verilir:

aöğlen "öncesi" ve "sonrası": "öğleden önce" veya "öğleden sonra"
Abüyük harflerle öğleden önce "önce" ve "öğleden sonra": "ÖÖ" veya "ÖS"
d2 basamaklı ayın günü (10'dan küçükse, önce sıfır) (01 ila 31)
D3 harfle haftanın günü. Örneğin, "Pzt" (Pazartesi)
jayın günü, başında sıfır olmadan 1-2 basamak (1'den 31'e kadar)
Fayın adı. Örneğin, "Ocak"
hsaat, 12 saat formatı (01 - 12)
Hsaat, 24 saat formatı (00 - 23)
gsaat, sıfır olmadan 12 saat biçimi (1'den 12'ye kadar)
Gsaat, sıfır olmadan 24 saat biçimi (0 - 23)
idakika (00 - 59)
ben (büyük harf i)1 gün ışığından yararlanma saati etkinse 0, aksi takdirde 0
LYıl artık yıl ise 1 veya artık yıl değilse 0
Bİnternet Saati (Alternatif Günün Saati) formatında saat (000 ila 999)
Tbilgisayarın saat dilimi. Örneğin, MDT
l (küçük harf L)haftanın günü. Örneğin, "Pazartesi"
may, sıfırlı iki basamak (01 - 12)
nay, sıfırsız bir veya iki basamak (1'den 12'ye kadar)
Mayın kısaltılmış adı. Örneğin, "Ocak"
tbelirtilen aydaki gün sayısı (28'den 31'e kadar)
ssaniye (0 ila 59)
Siki harfli İngilizce sıra eki ("st", "nd", "rd" veya "th")
senUNIX çağının başlangıcından bu yana geçen tam sayı saniye sayısı
yyıl, dijital, 2 basamak (14)
Yyıl, dijital, 4 basamak (2014)
zyıldaki günün sıra sayısı (0'dan 365'e kadar)
Zsaniye cinsinden saat dilimi farkı (-43200 - 43200)
NISO-8601 standardına göre 1'den (Pazartesi) 7'ye (Pazar) kadar haftanın gününün sıra sayısı, (PHP 5.1.0'da eklendi)
w0 (Pazar) ile 6 (Cumartesi) arasında haftanın gününün sıra sayısı
WISO-8601 standardına göre yılın haftasının seri numarası; haftalar Pazartesi günü başlar (PHP 4.1.0'da eklenmiştir)
ÖISO-8601 standardına göre yıl numarası. ISO hafta numarasının (W) önceki veya sonraki yıla ait olduğu durumlar dışında Y ile aynı anlama sahiptir; o zaman o haftanın yılı kullanılacaktır. (PHP 5.1.0'da eklendi)
esaat dilimi kodu. Örneğin: UTC, GMT, Atlantik/Azorlar (PHP 5.1.0'da eklendi)
ÖGreenwich Ortalama Saati'nden saat cinsinden farkı. Örneğin: +0200
PGreenwich Ortalama Saatinden saat ve dakika arasında iki nokta üst üste ile fark. Örneğin: +02:00 (PHP 5.1.3'te eklendi)
cISO 8601 biçiminde tarih. Örneğin, 2014-12-12T15:19:21+00:00 (PHP 5'te eklendi)
r» RFC 2822 biçiminde tarih. Örneğin: Per, 21 Aralık 2000 16:01:07 +0200
senUnix Epoch'un başlangıcından bu yana geçen saniye sayısı (The Unix Epoch, 1 Ocak 1970 00:00:00 GMT)

Listeden de görebileceğiniz gibi, bu fonksiyon ile birçok faydalı tarih verisi elde edebilirsiniz. Örneğin:

$tarih = 1418372345; // orijinal tarih ve saat 12/12/2014 11:19:05

echo tarih ("d.m.Y" , $tarih); // 12/12/2014 (tarih)
echo tarih("H:i:s", $tarih); // 11:19:05 (zaman)
echo tarih("H:i", $tarih); // 11:19 (zaman)
echo tarih("t", $tarih); // 31 (bir aydaki gün sayısı)
echo tarih("z", $tarih); // 345 (yıl içinde günün seri numarası)
echo date("l dS \of F Y h:i:s A" , $tarih); // 12 Aralık 2014 Cuma 11:19:05

Desene dahil olan diğer karakterler, dizede olduğu gibi görüntülenecektir. İşlevde biçim kodu olarak kullanılan bir karakter girmeniz gerekiyorsa, bunların önüne bir "\" karakteri eklenir. "\n" (yeni satır karakteri) değeri için "\\n" belirtilmelidir. Böylece, tarih ve saat bilgilerini içeren tüm bir mesajın çıktısını alabilirsiniz:

yankı tarihi( "Bugün Y. yılın z. günü", $tarih); // Bugün 2014'ün 345. günü

Tarih ve saati zaman damgası biçimine dönüştürün

Bir tarihi standart biçimden sayısal bir zaman damgası değerine dönüştürmek için şu işlevi kullanın:

int mktime(]]]]]])

mktime() işlevi, bağımsız değişkenler tarafından verilen tarih ve saate karşılık gelen bir Unix zaman değeri döndürür. Örneğin:

$my_date = mktime(10, 30, 0, 12, 12, 2014);

İşlev argümanlarının sırasına dikkat etmelisiniz: saat, dakika, saniye, ay, gün, yıl.

Bir zaman damgasında basitçe bir tarih değeri oluşturmaya ek olarak, mktime() işlevi, tarihlerle aritmetik yapmak için kullanılabilir. Bunu yapmak için gerekli argümanları girmeniz yeterlidir. Örneğin, 14. ayı belirtirseniz, son değerde ay 2. olur ve yılın değeri bir artar:

$my_day = 12;
$ay_ay = 12;
$my_year = 2014;

$yeni_tarih = mktime(0, 0, 0, $my_ay + 5, $my_day, $my_year);

echo tarih ("d.m.Y" , $yeni_tarih); // 05/12/2015 (tarih)

Aynı şeyi diğer parametrelerle de yapabilirsiniz.

PHP'de Tarihi Doğrula

Tarihlerle çalışırken, özellikle yukarıda önerilen mktime() işlevini kullanarak bir tarih oluştururken, girilen tarihin doğruluğunu dikkate almak gerekir. Bunu yapmak için PHP aşağıdaki işlevi kullanır:

bool checkdate(int ay, int gün, int yıl)

Bağımsız değişkenler tarafından verilen tarih doğruysa true değerini döndürür; aksi takdirde false döndürür. Aşağıdaki durumlarda tarih doğru kabul edilir:

1 ila 32767 aralığında yıl;

1'den 12'ye kadar olan aralıkta ay;

Artık yıl dikkate alınarak verilen ayın günü doğrudur.

Tarih doğrulama örneği:

$my_day = 32;
$ay_ay = 12;
$my_year = 2014;

if (!checkdate($my_ay, $my_day, $my_year))
Eko "Hata: Geçersiz tarih";