v2.5.2
Giriş yap

dizi array dan gelen veriyi tarih verisine göre listeleme

kertmeyenkele
346 defa görüntülendi ve 1 kişi tarafından değerlendirildi

arrayda veriyi şu şekilde tutuyorum

    
  $array = "1234|4756|1|31.01.2023,5678|6453|2|01.02.2023"
    
    

veri dizisini kendi arasında virgül (,) ile ayırıyorum. her veri dizisini içinde | işareti ile ayırıyorum ve 4 bölümden oluşuyor.

buradaki verileri kullanarak array ile listeleme yapıyorum. istediğim array içerisinden gelen veriyi | işaretinden ayıklayarak tarihe göre almak ancak bunu başaramadım. (foreach) döngüsüne alıyorum ancak tarih haliyle karışık geliyor. nasıl yapabilirim?

örnek :

    
  
  $array = "1234|4756|1|31.01.2023,5678,6453,2,01.02.2023"
   
   
     for ($i2=0; $i2<$kactane2; $i2++) { 

	    $urunler = explode(",", $array);
	   foreach ($urunler as $urunveri) {
		   
			$data = explode("|", $urunveri); 
			
			// BURAYA VERİLER GELİYOR. VE İŞLEMLERİ YAPABİLİYORUM. 
			// ANCAK BURADA GELEN VERİLER ARTIK AYRIŞTIRDIKTAN SONRA
			// KARIŞIK TARİH İLE GELİYOR. 
			// TAM BU AŞAMADA TARİHİ NASIL SIRAYA ALIRIM?
			
			}
			
			}
    
Cevap yaz
Cevaplar (8)
ebykdrms
564 gün önce

Aşağıdaki kodu https://onlinephp.io sitesinde PHP sürümünü 5.6.40'a çekerek denediğimde sorunsuz çalışıyor.

<?php
date_default_timezone_set("Europe/Istanbul");

$array = "1234|4756|1|31.01.2023,5678|6453|2|01.02.2021,5678|6453|2|01.02.2022";
$fixedArray = [];

$groups = explode(",", $array);
// input ($array): "1234|4756|1|31.01.2023,5678|6453|2|01.02.2021"
// output ($groups): ["1234|4756|1|31.01.2023", "5678|6453|2|01.02.2021"]

foreach($groups as $group) $fixedArray[] = explode("|", $group);
// input ($groups): ["1234|4756|1|31.01.2023", "5678|6453|2|01.02.2023"]
// output ($fixedArray): [["1234", "4756", "1", "31.01.2023"], ["5678", "6453", "2", "01.02.2021"]]

usort($fixedArray, function ($a, $b) {
    if(strtotime($a[3]) < strtotime($b[3])) return -1;
    if(strtotime($a[3]) > strtotime($b[3])) return 1;
    return 0;
});
// input ($fixedArray): [["1234", "4756", "1", "31.01.2023"], ["5678", "6453", "2", "01.02.2021"]]
// output ($fixedArray): [["5678", "6453", "2", "01.02.2021"], ["1234", "4756", "1", "31.01.2023"]]

print_r($fixedArray);

Eğer hem hata vermiyor hem de sıralama yapmıyorsa muhtemelen ekrana doğru değişkeni basmıyorsunuz veya yanlış zamanda basıyorsunuz veya tarihler karşılaştırma yaptığınız index'te (3.index) bulunmuyor. Kodlarınızı görmeden bu aşamadan sonra yanıt vermem zor.
Belki sorun date'tedir diyerek farklı bi'şey deneyebiliriz. date yerine doğrudan string üzerinde de tarih sıralaması yapabiliriz.

Eğer tarihi yıl-ay-gün şeklinde yyyy.mm.dd formatında bir string'e çevirirsek ve alfabetik olarak sıralamaya çalışırsak yine doğru tarih sıralamasına ulaşabiliriz.
Bunu da şu şekilde yapmak mümkün:

usort($fixedArray, function ($a, $b) {
    $date1 = explode(".", $a[3]); // "01.02.2022" -> ["01", "02", "2022"]
    $date1 = array_reverse($date1); // ["01", "02", "2022"] -> ["2022", "02", "01"]
    $date1 = implode(".", $date1); // ["2022", "02", "01"] -> "2022.02.01"
    
    $date2 = implode(".", array_reverse(explode(".", $b[3]))); // Üsttekinin tek satır hali
    
    return strcmp($date1, $date2); // strcmp() fonksiyonu string ifadeleri karşılaştırır. Tam sort'un istediği şekilde -1, 0 veya 1 döner.
});

Bu kodları da aynı sitede denedim ve doğru şekilde tarihleri eskiden yeniye doğru sıralandı.

kertmeyenkele
565 gün önce

@ebykdrms teşekkür ederim. artık 500 internal server hatası almıyorum.

ancak sıralama yapamıyorum. sebebi sanıyorum usort fonksiyonunun
php 7 altında randımanlı çalışmıyor olması.
bunu php 7 sürüm altı için nasıl düzenleyebilirim diye 2 gündür sort, ksort gibi alternatifler ile bir deneme yapmaya çalıştım ancak bir yol kat edemedim. sizin tecrübeniz fazla ve sizin çözümünüz ile bir yere gelebildim. çok şey istemiş olmuyorsam, usort yerine ne kullanabiliriz. yada bu alanı nasıl düzenleriz?

sonuç itibari ile çok çok teşekkür ediyorum. işin mantığınıda az çok kavramış bulundum
ve eksik bir bilgiyi kapatmış oldum. ancak sıralama yapamadım ve çözümleyemedim.

(mevcut kodlarımın dışında, verilen örnekteki $array parametresi ile de sıralamaya
çalıştığımda sonuç alamıyorum. kodlar sonuç vermiyor ve sıralama değişmiyor)

kartal
566 gün önce

yeni bir tablo oluşturup order by ile tarihe göre alabilirsin.
bu daha sonra burada olmada da başka yerlerdede işini kolaylaştırır.

ebykdrms
567 gün önce

Daha önce yazdığım cevabı düzenledim.

kertmeyenkele
568 gün önce

@abdullahx teşekkür ederim ama ne yazıkki olmadı.

    
 usort($fixedArray, function($a, $b) {
return strtotime($a[3]) <=> strtotime($b[3]);
});
    

yukarıdaki satırı eklediğimde 500 internal server error hatası alıyorum.
satırı kaldırdığımda çalışıyor.

muhtemelen <=>

    
<=> strtotime($b[3]);
    

şu bağlaç çalışmıyor bu engel oluyor.

şu şekilde çalışıyor mesela :

    
 usort($fixedArray, function($a, $b) {
return strtotime($a[3]);
});
    

çözümü varmıdır? nasıl yaparız?

abdullahx
568 gün önce

usort($fixedArray, function($a, $b) {
return strtotime($a[3]) <=> strtotime($b[3]);
});
kertmeyenkele
568 gün önce

@ebykdrms çok teşekkür ederim. ancak platform php 7.0 desteklemiyor ve özel bir sebepten 5.6 üzerinde çalışmak zorundayım.
ondan mı kaynaklanıyor bilemiyorum ancak;

    
usort($fixedArray, fn($a, $b) => strtotime($a[3]) <=> strtotime($b[3]));
    
    

bu satır olunca 500 internal server error hatası alıyorum. silince sayfa açılıyor
silince hata almıyorum ancak hali ile kod bloğu çalışmıyor.

ne yapmak gerekir? 5.6 için uyarlanabilirmi?

ebykdrms
569 gün önce
// Giriş verilerimiz:
$array = "1234|4756|1|31.01.2023,5678|6453|2|01.02.2021"

// Düzenlenmiş array'i tutacak değişkenimiz:
$fixedArray = [];

// Önce "," karakterinden gruplara ayırıyoruz:
$groups = explode(",", $array);
// input ($array): "1234|4756|1|31.01.2023,5678|6453|2|01.02.2021"
// output ($groups): ["1234|4756|1|31.01.2023", "5678|6453|2|01.02.2021"]

// Sonra her grubu kendi içinde "|" karakterinden ayırıyoruz:
foreach($groups as $group) $fixedArray[] = explode("|", $group);
// input ($groups): ["1234|4756|1|31.01.2023", "5678|6453|2|01.02.2023"]
// output ($fixedArray): [["1234", "4756", "1", "31.01.2023"], ["5678", "6453", "2", "01.02.2021"]]

// Düzenlenmiş grubumuzu tarihe göre küçükten büyüğe sıralıyoruz:
usort($fixedArray, fn($a, $b) => strtotime($a[3]) <=> strtotime($b[3]));
// input ($fixedArray): [["1234", "4756", "1", "31.01.2023"], ["5678", "6453", "2", "01.02.2021"]]
// output ($fixedArray): [["5678", "6453", "2", "01.02.2021"], ["1234", "4756", "1", "31.01.2023"]]

// Sonuç $fixedArray dizisinde bulunuyor:
print_r($fixedArray);

PHP'nin 7'den eski sürümlere uyumlu olması için usort() fonksiyonu şöyle de olabilir:

usort($fixedArray, function ($a, $b) {
    if(strtotime($a[3]) < strtotime($b[3])) return -1;
    if(strtotime($a[3]) > strtotime($b[3])) return 1;
    return 0;
});