Вход Регистрация
Файл: concrete5.7.5.6/concrete/vendor/punic/punic/code/Comparer.php
Строк: 64
<?php

namespace Punic;

/**
 * Various helper stuff.
 */
class Comparer
{
    
/**
     * @var array
     */
    
private $cache;

    
/**
     * @var bool
     */
    
private $caseSensitive;

    
/**
     * @var Collator|null
     */
    
private $collator;

    
/**
     * @var bool
     */
    
private $iconv;

    
/**
     * Initializes the instance.
     *
     * @param string $locale
     * @param bool $caseSensitive
     */
    
public function __construct($locale null$caseSensitive false)
    {
        
$this->cache = array();
        
$this->locale = isset($locale) ? $locale PunicData::getDefaultLocale();
        
$this->caseSensitive = (bool) $caseSensitive;
        
$this->collator class_exists('Collator') ? new Collator($this->locale) : null;
        
$this->iconv function_exists('iconv');
    }

    
/**
     * @param string $str
     *
     * @return string
     */
    
private function normalize($str)
    {
        
$str = (string) $str;
        if (!isset(
$this->cache[$str])) {
            
$this->cache[$str] = $str;
            if (
$str !== '') {
                if (
$this->iconv) {
                    
$transliterated = @iconv('UTF-8''ASCII//IGNORE//TRANSLIT'$str);
                    if (
$transliterated !== false) {
                        
$this->cache[$str] = $transliterated;
                    }
                }
            }
        }

        return 
$this->cache[$str];
    }

    
/**
     * Compare two strings.
     *
     * @param string $a
     * @param string $b
     *
     * @return int
     */
    
public function compare($a$b)
    {
        if (isset(
$this->collator)) {
            
$a = (string) $a;
            
$b = (string) $b;
            if (
$this->caseSensitive) {
                
$result $this->collator->compare($a$b);
            } else {
                
$array = array($a$b);
                if (
$this->sort($array) === false) {
                    
$result false;
                } else {
                    
$ia array_search($a$array);
                    if (
$ia === 1) {
                        
$result 1;
                    } else {
                        
$ib array_search($b$array);
                        if (
$ib === 1) {
                            
$result = -1;
                        } else {
                            
$result 0;
                        }
                    }
                }
            }
        } else {
            
$a $this->normalize($a);
            
$b $this->normalize($b);

            
$result $this->caseSensitive strnatcmp($a$b) : strnatcasecmp($a$b);
        }

        return 
$result;
    }

    
/**
     * @param array $array
     * @param bool $keepKeys
     *
     * @return array
     */
    
public function sort(&$array$keepKeys false)
    {
        
$me $this;
        if (
$keepKeys) {
            if (isset(
$this->collator)) {
                
$result $this->collator->asort($array);
            } else {
                
$result uasort(
                    
$array,
                    function (
$a$b) use ($me) {
                        return 
$me->compare($a$b);
                    }
                );
            }
        } else {
            if (isset(
$this->collator)) {
                
$result $this->collator->sort($array);
            } else {
                
$result usort(
                    
$array,
                    function (
$a$b) use ($me) {
                        return 
$me->compare($a$b);
                    }
                );
            }
        }

        return 
$result;
    }
}
Онлайн: 1
Реклама