Bir dizideki en uzun elemanın (karakter) uzunluğunu tespit etmek için en iyi yolu nedir?

6 Cevap php

Bir dizideki en uzun elemanın (karakter) uzunluğunu tespit etmek için en iyi yolu nedir?

Ben dinamik genişliğini ayarlayabilirsiniz böylece bir seçme kutusu için seçenek değerlerini bir dizi uzun eleman bulmak gerekir.

6 Cevap

Bu uzun değerin anahtarını verir ve aynı zamanda değerini kendisi verebilir

function array_longest_value( $array, &$val = null )
{
    $val = null;
    $result = null;

    foreach( array_keys( $array ) as $i )
    {
    	$l = strlen( $array[ $i ] );
    	if ( $l > $result )
    	{
    		$result = $i;
    		$val = $array[ $i ];
    	}
    }

    return $result;
}

Sadece en yüksek değerini isterseniz:

echo max(array_map('strlen', $arr));

Eğer uzun değerlerini isterseniz:

function array_longest_strings(array $arr)
{
    $arr2 = array_map('strlen', $arr);
    $arr3 = array_intersect($arr2, array(max($arr2)));
    return array_intersect_key($arr, $arr3);
}
print_r(array_longest_strings($arr));

Ben farklı bu yazma, ve daha az belirgin yolu, onu cehennem için düşündüm.

Hiçbir koşul, bu nasıl çalıştığını anlamak, okuyucuya sol bir egzersizdir.

$x = array( 
  'foo ', 'bar ____' , 'baz', 'q-----------', 'doo' 
);

function max_str( $stringArray )
{
  $m = '_'; 
  foreach($stringArray as $item ) 
  {
    $m[ strlen($item) ] = '_'; 
  }
  return strlen( $m ); 
}


print max_str( $x );

Note: $m sadece "" çalışmıyor olması için ayarlama. Php berbat ve nedense $m bir diziye atmalarını. Saf Genius.

Comment Responses

What's the point of not initializing $m=0 and then in the loop do $m = max($m, strlen($item))

Ben farklı olmak istedim çünkü. Cevap bu kapsam sağlanmıştır. Burada Fikir denemek ve "görsel" işlenmesi, mantıksal anlamda, ben mümkün olduğunca yakın almaya çalışırken oldu "dinamik bir metin kutusu içine yazdırmak ve metin kutusu ne kadar geniş olduğunu görmek" mantığı. Burada tek sorun dizeleri böylece dikey "hat" Ben alabilir gibi yakın istifleme, 2 boyutlu değil olmasıdır. Ne gerçekten yapmak istediğim gibi bir şeydir

 substr( $m , 0 , strlen($item)) = $item;

Ama php Sol taraf yoktur, ve bu karmaşık ve uygulamak için korkunç döngüler kullanılan olurdu, bu yüzden sadece $ uzunluk konumunda '_' ile biraz kısa devre.

Tabii, bu sorunun yanlış bir yaklaşımdır, ancak IMO, ne teşebbüs ediliyor ve PHP ile çözme fikri de soruna yanlış bir yaklaşım olduğunu iddia, bu yüzden olabilir yanlış bir şey yapacağım, ben muhtemelen aynı zamanda diğer garip kodlama hileler açığa şekillerde yaratıcı yanlış olabilir.

Ayrıca, bildiğim kadarıyla gördüğünüz gibi işlev $ stringArray = array ("") için yanlış olur ..

Kullanıcı hiçbir dizeleri veya 0 uzunluğu olmak üzere tüm dizeleri ile bir seçenek kutusu varsa Evet, itiraf etmeliyim ki bir küçük uyarı, ancak, bir büyük ile başlamak başarısız olması, haklı bir seçenek kutusu bir atmak verecek kimse yok Bu durumda 5 piksel çok büyük.

Why its all made of Fail

Gerçekçi, tam teşekküllü bir karakter karakter aralığı haritası tüketilen etkili uzayda karakter çiftleri ilişkilendirilmesi sahip olmayan herhangi bir algoritma yanlış olacaktır. Sen boşluklu bir yazı tipiyle iyiyiz, ama başka bir şey hillarious olacaktır.

  • iiiiiiiiii
  • llllllllll
  • oooooooooo
  • mmmmmmmmmm
  • iiiiiiiiii
  • llllllllll
  • oooooooooo
  • mmmmmmmmmm
  • iiiiiiiiii
  • llllllllll
  • oooooooooo
  • mmmmmmmmmm

10 Her kopyaları, ancak bu tür bir kullanım alanı çeşitliliği!

$longval = 0;
$index = -1;

for($i = 0; $i < count($array); $i++)  {
   if($len = strlen($array[$i]) > $longval) { 
       $longval = $len;
       $index = $i;
   }
}

Sonra biliyorsun $array[$index] uzunluğunun uzun unsuru vardır $longval

Bunu yapmanın iki yolu vardır:

  1. Tüm dizi üzerinde yineleme ve maksimum eleman boyutu tutmak;
  2. Tüm dizi üzerinde yineleme ve sihirli bir şapka :-) maksimum eleman boyutu alınamıyor

Sonra, size bir şeyler göstermek için kullanıyor olacak ne yazı bilmek zorunda ve hangi kelimelerin gerçek genişliğini hesaplamak mümkün olacak, böylece caracter boyutları, kernings ve her şeyi alırsınız Bir fixed width yazı tipini kullanarak sürece, görüntülediğiniz olacak dize caracters sayısı değildir.

Ben bu high watermark algorithm denir inanıyorum. O (n) liste zaten O (1) olacaktır uzunluğuna göre sıralanır sürece bunun için almak için gidiyoruz en iyisidir.

"Las Vegas'ta bir dik bir tepenin üzerinde gidip Batı bakmak ve göz sağ tür neredeyse yüksek su işareti görebilirsiniz olabilir -. Dalga nihayet kırdı ve geri alındı ​​yer" - Dr Hunter S. Thompson