Çoğu yöneticileriniz PHP x ve bir dizi y koordinatları sıralama?

4 Cevap php

Şu anda çeşitli pozisyonlarda x ve y koordinatlarını içeren bir dizi var.

ex. $location[0]['x'] = 1; $location[0]['y'] = 1

Bu id 0 (1,1) bir konuma sahip olduğunu gösterir.

Bazen y bu x ile dizi ve diğer zamanlarda sıralamak istiyorum.

Şu anda benim verileri sıralamak için) (dizi-MULTISORT kullanıyorum, ama ben sıralama, ben x veya y sadece dizin oluşturmak $ konum dizi (üzerinden bir doğrusal geçiş yapmak gerekir önce bu yöntem her zamandan beri verimsiz hissediyorum Ben dizi-MULTISORT () komutunu çağırabilirsiniz önce) tuşuna basın.

Herkes bunu yapmak için daha iyi bir yol biliyor mu? Belki de hatta bu gibi veri depolamak için kötü bir fikirdir? Herhangi bir öneriniz çok iyi olurdu.

4 Cevap

Eğer dizi elemanları nasıl karşılaştırılır seçim usort(), hangi sağlar kullanabilirsiniz.

// sort by 'y'
usort($location, 'cmp_location_y');

// or sort by 'x'
usort($location, 'cmp_location_x');

// here are the comparison functions
function cmp_location_x($a, $b) {
    return cmp_location($a, $b, 'x');
}

function cmp_location_y($a, $b) {
    return cmp_location($a, $b, 'y');
}

function cmp_location($a, $b, $key) {
    if ($a[$key] == $b[$key]) {
    	return 0;
    } else if ($a[$key] < $b[$key]) {
    	return -1;
    } else {
    	return 1;
    }
}

Sen MULTISORT kullanmaya devam etmek istiyorum.

Ben usort ve array_multisort hızlı bir kriter yaptı. Hatta bir dizin bina ile sadece 10 MULTISORT bir sayıma usort daha hızlıdır. 100 elemanlarında yaklaşık 5 kat daha hızlı. Hızlı doğru bir büyüklükte kapalı yaklaşık 1000 unsurlar gelişme seviyelerinde. Kullanıcı işlev çağrıları sadece çok yavaş. Ben 5.2.6 koşuyorum

$count = 100;

for ($i = 0; $i < $count; $i++)
{
  $temp = array('x' => rand(), 'y' => rand());
  $data[] = $temp; 
  $data2[] = $temp; 
}

function sortByX($a, $b) { return ($a['x'] > $b['x']); }

$start = microtime(true);
usort($data, "sortByX");
echo (microtime(true) - $start) * 1000000, "<br/>\n";

$start = microtime(true);
foreach ($data2 as $temp)
  $s[] = $temp['x'];
array_multisort($s, SORT_NUMERIC, $data2);
echo (microtime(true) - $start) * 1000000, "<br/>\n";

PHP'nin yakut gibi bir array_pluck fonksiyonu yoktur. Öyle Bir kez bu kodu değiştirebilirsiniz

foreach ($data2 as $temp)
    $s[] = $temp['x'];`

ile

$s = array_pluck('x', $data2);

Jcinacio söyledikleri gibi bir şey. Bu sınıf, gerçekten farklı boyutlarda sadece konumları her türlü veriyi depolamak ve sıralayabilirsiniz. Gerektiğinde kaldırmak vb gibi diğer yöntemleri uygulayabilirsiniz.

class Locations {
    public $locations = array();
    public $data = array();
    public $dimensions = 2;

    public function __construct($dimensions = null)
    {
    	if (is_int($dimensions))
    		$this->dimensions = $dimensions;
    }

    public function addLocation()
    {
    	$t = func_num_args();

    	if ($t !== $this->dimensions)
    		throw new Exception("This Locations object has {$this->dimensions} dimensions");

    	$args = func_get_args();

    	for ($i = 0; $i < $t; $i++)
    		$this->locations[$i][] = $args[$i];

    	return $this;
    }

    public function sortByDimension($dimension = 1) 
    {
    	if ($dimension > $this->dimensions)
    		throw new Exception("Wrong number of dimensions");

    	--$dimension;

    	$params[] = &$this->locations[$dimension];

    	for ($i = 0, $t = $this->dimensions; $i < $t; $i++) {
    		if ($i === $dimension)
    			continue;

    		$params[] = &$this->locations[$i];
    	}

    	call_user_func_array('array_multisort', $params);

    	return $this;
    }
}

test verileri:

$loc = new Locations(3);

$loc
    ->addLocation(1, 1, 'A')
    ->addLocation(2, 3, 'B')
    ->addLocation(4, 2, 'C')
    ->addLocation(3, 2, 'D')
;
$loc->sortByDimension(1);
var_dump($loc->locations);
$loc->sortByDimension(2);
var_dump($loc->locations);

Eğer varsa diziler ve MULTISORT tutarak, aşağıdaki gibi bir şey yapısını değiştirerek bir önceki geçişte için ihtiyacı ortadan kaldıracaktır:

$locations = array( 
    'x' => $x_coordinates,
    'y' => $y_coordinates,
    'data' => $data_array
);

sonra sadece tüm sütun üzerinde array_multisort () kullanın.