• 09-05-2020, 02:54:59
    #1
    Array
    (
    [07:50] => Array
    (
    [1] => Array
    (
    [sira] => 1
    [spot] => 23131
    )
    
    )
    
    [08:00] => Array
    (
    [1] => Array
    (
    [sira] => 1
    [spot] => 23130
    )
    
    )
    
    [08:10] => Array
    (
    [1] => Array
    (
    [sira] => 1
    [spot] => 23131
    )
    
    )
    )
    Şu tarz bir arrayım var tabi gün boyu giden bu array ın key değerine en yakın saati nasıl bulabilirim. Liste gün boyu gittiği için örnek vermek gerekirse saat 14.21'de benim 14.15 e mi yoksa 14.30'a mı yakın onu bulmam lazım.
  • 09-05-2020, 03:02:24
    #2
    Kimlik doğrulama veya yönetimden onay bekliyor.
    Arrayde kac element olacak? Ona gore binary search veya basit bir loop ile cozulebilir bu problem.
  • 09-05-2020, 03:22:55
    #3
    ata350 adlı üyeden alıntı: mesajı görüntüle
    Arrayde kac element olacak? Ona gore binary search veya basit bir loop ile cozulebilir bu problem.
    Hocam ortalama 50-55 arası saat keyli array ve onların içinde de ortalama 10-25 arası array olacak.
  • 09-05-2020, 03:41:55
    #4
    Eleman sayın kadar for döndür. Farkı bir değikende tut. Mutlak olarak çıkarma yap. Değer olarak hangisi daha küçükse on yakınsındır. Eşitlik durumunu unutma. Mesela bu örnek için 15.00 15.15 istenen de 15.08 olsun. İkisine de aynı uzaklıkta
    Kolay gelsin.
  • 09-05-2020, 04:02:03
    #5
    Saatleri Date objesine dönüştürüp sonra milissecond a çevirirseniz sıralama daha kolay olacaktır . Mesela bunun gibi 1588986024362
  • 09-05-2020, 06:22:04
    #6
    uksort ile anahtarlarına göre bir diziyi kendi kurallarınız doğrultusunda sıralayabilirsiniz. Aşağıda diziyi o an ki saate en yakından en uzağa sıralıyorum, array_shift ile çekeceğiniz eleman en yakın olacaktır. Burda dikkat etmeniz gereken diziyi yeniden sıralamamız, eğer diziyi daha sonra farklı işlemler için kullanacaksanız ve sıralaması önemli ise önce başka bir değişkene atayıp daha sonra o dizi üzerinden işlem yapmanız olacak.

    uksort($saatler, function ($p1, $p2){
    $simdi = time();
    $p1_parts = explode(":", $p1);
    $p1t = mktime($p1_parts[0], $p1_parts[1]);
    $p2_parts = explode(":", $p2);
    $p2t = mktime($p2_parts[0], $p2_parts[1]);
    
    if(abs($simdi - $p1t) < abs($simdi - $p2t)){
    return -1;
    }elseif (abs($simdi - $p1t) > abs($simdi - $p2t)){
    return 1;
    }else{
    return 0;
    }
    });
    
    print_r($saatler);
    
    $en_yakin = array_shift($saatler);
  • 09-05-2020, 17:08:56
    #7
    Met adlı üyeden alıntı: mesajı görüntüle
    uksort ile anahtarlarına göre bir diziyi kendi kurallarınız doğrultusunda sıralayabilirsiniz. Aşağıda diziyi o an ki saate en yakından en uzağa sıralıyorum, array_shift ile çekeceğiniz eleman en yakın olacaktır. Burda dikkat etmeniz gereken diziyi yeniden sıralamamız, eğer diziyi daha sonra farklı işlemler için kullanacaksanız ve sıralaması önemli ise önce başka bir değişkene atayıp daha sonra o dizi üzerinden işlem yapmanız olacak.

    uksort($saatler, function ($p1, $p2){
    $simdi = time();
    $p1_parts = explode(":", $p1);
    $p1t = mktime($p1_parts[0], $p1_parts[1]);
    $p2_parts = explode(":", $p2);
    $p2t = mktime($p2_parts[0], $p2_parts[1]);
    
    if(abs($simdi - $p1t) < abs($simdi - $p2t)){
    return -1;
    }elseif (abs($simdi - $p1t) > abs($simdi - $p2t)){
    return 1;
    }else{
    return 0;
    }
    });
    
    print_r($saatler);
    
    $en_yakin = array_shift($saatler);
    Teşekkürler hocam işime yaradı