v2.5.2
Giriş yap

dizi array dan gelen veriyi tarih verisine göre listeleme

kertmeyenkele
347 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?
			
			}
			
			}
    
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ı.