Sonuçları seçerek PHP Array

7 Cevap php

Ben şu diziyi varsa:

$Unmanaged =    array(
    			array('name' => 'SD2005', 'speed' => '1000', 'size' => 'desk', 'uplink' => 'no'),
    			array('name' => 'SD2008', 'speed' => '1000', 'size' => 'desk', 'uplink' => 'no'),
    			array('name' => 'SR2016', 'speed' => '1000', 'size' => 'rack', 'uplink' => 'no'),
    			array('name' => 'SR2024', 'speed' => '1000', 'size' => 'rack', 'uplink' => 'no'),
    			array('name' => 'SR2024C', 'speed' => '1000', 'size' => 'rack', 'uplink' => 'no'),
    			array('name' => 'SD205', 'speed' => '100', 'size' => 'desk', 'uplink' => 'no'),
    			array('name' => 'SD208', 'speed' => '100', 'size' => 'desk', 'uplink' => 'no'),
    			array('name' => 'SD216', 'speed' => '100', 'size' => 'desk', 'uplink' => 'no'),
    			array('name' => 'SR224G', 'speed' => '100', 'size' => 'rack', 'uplink' => 'yes'),
    			array('name' => 'SR216', 'speed' => '100', 'size' => 'rack', 'uplink' => 'no'),
    			array('name' => 'SR224', 'speed' => '100', 'size' => 'rack', 'uplink' => 'no'),
    			array('name' => 'SR224R', 'speed' => '100', 'size' => 'rack', 'uplink' => 'no')
                );

nasıl olur ben örneğin bir belirli kriterlere uyan tüm girdileri dönen tüm girişleri aracılığıyla döngüsü: hız tüm anahtarlar: 100, boy: masa ve uplink: hayır?

Lütfen yardım edin.

Thanks, Ben

7 Cevap

İşte array_filter() kullanarak bunu nasıl bulunuyor:

function my_callback($elem) {
    return $elem['speed']==100 && $elem['size']=='desk' && $elem['uplink']=='no';
}

$results = array_filter($Unmanaged, 'my_callback');

PHP 5.3 'nin anonim fonksiyonlar kullanarak, çalışma zamanında seçilen değerler dinamik yapabilirsiniz:

function create_callback($speed, $size, $uplink) {
    return function ($elem) use ($speed, $size, $uplink) { 
        return $elem['speed']==$speed && $elem['size']==$size && $elem['uplink']==$uplink;
    };
}

$results = array_filter($unmanaged, create_callback(100, 'desk', 'no'));

Edit: Sadece yorumladı, sadece anahtarın adını istiyorum. Sorun yok; Yukarıdaki çözümlerden birini kullandıktan sonra ekleyebilirsiniz:

function get_name($elem) { return $elem['name']; }
$names = array_map('get_name', $results);

Aşağıdaki gibi bir şey? Bu yöntemi kullanarak durumu kontrol her şekilde dahil olabilir ve siz de kullanabilir veya olabilir unutma | sonuç seti seçmek için "|".

foreach($Unmanaged as $result)
{
    if($result['speed'] == "100" && $result['size'] == "desk" && $result['uplink'] == "no")
    {
    	echo $result['name'];
    }

}

dizi çalıştırmak için bazı seçenek:

  1. foreach ($ anahtar olarak $ dizi => $ val)
  2. while (list ($ key, $ val) = each ($ dizi)) {
  3. array_walk ($ dizi, işlev)

Buyrun:

function getSwitches($switches,$speed=100,$size='desk',$uplink='no')
{
    $sw = array();

   foreach($switches as $s)
   {
	if(
		$s['speed'] == $speed &&
		$s['size'] == $size &&
		$s['uplink'] == $uplink
	)

	$sw[] = $s;
   }

   return $sw;
}

print_r(getSwitches($Unmanaged,100,'desk','no'));

Kısıtlamaları değişken Başka bir seçenek:

function matches($values, $constraints) {
    $hits = array();
    foreach($values as $val) {
        $ok = true;
        foreach($constraints as $k => $v) {
            if($val[$k] != $v) $ok = false;
        }
        if($ok) $hits[] = $val;
    }
    return $hits;
}

$Unmanaged = array(
    array('name' => 'SD2005', 'speed' => '1000', 'size' => 'desk', 'uplink' => 'no'),
    array('name' => 'SD2008', 'speed' => '1000', 'size' => 'desk', 'uplink' => 'no'),
    array('name' => 'SR2016', 'speed' => '1000', 'size' => 'rack', 'uplink' => 'no'),
    array('name' => 'SR2024', 'speed' => '1000', 'size' => 'rack', 'uplink' => 'no'),
    array('name' => 'SR2024C', 'speed' => '1000', 'size' => 'rack', 'uplink' => 'no'),
    array('name' => 'SD205', 'speed' => '100', 'size' => 'desk', 'uplink' => 'no'),
    array('name' => 'SD208', 'speed' => '100', 'size' => 'desk', 'uplink' => 'no'),
    array('name' => 'SD216', 'speed' => '100', 'size' => 'desk', 'uplink' => 'no'),
    array('name' => 'SR224G', 'speed' => '100', 'size' => 'rack', 'uplink' => 'yes'),
    array('name' => 'SR216', 'speed' => '100', 'size' => 'rack', 'uplink' => 'no'),
    array('name' => 'SR224', 'speed' => '100', 'size' => 'rack', 'uplink' => 'no'),
    array('name' => 'SR224R', 'speed' => '100', 'size' => 'rack', 'uplink' => 'no')
);

print_r(matches($Unmanaged, array('speed'=>'100', 'size'=>'desk', 'uplink'=>'no')));

Çıktı:

Array
(
    [0] => Array
        (
            [name] => SD205
            [speed] => 100
            [size] => desk
            [uplink] => no
        )

    [1] => Array
        (
            [name] => SD208
            [speed] => 100
            [size] => desk
            [uplink] => no
        )

    [2] => Array
        (
            [name] => SD216
            [speed] => 100
            [size] => desk
            [uplink] => no
        )

)

Benim de bir çözüm sonrası olabilir ..

function matchElement($haystack, $needleArray) {
    $result = array();
    for($i = 0, $c = count($haystack); $i < $c; $i++) {
    	$matchall = true;
    	foreach($needleArray as $k => $v) {
    		if(!isset($haystack[$i][$k]) || $haystack[$i][$k] != $v) {
    			$matchall = false;
    			break;
    		}
    	}
    	if($matchall) {
    		$result[] = $haystack[$i];
    	}
    }

    return $result;
}

print_r(matchElement($Unmanaged, array("speed" => 100, "size" => "rack")));

Diğer yorumlar için tersine, ben bir veritabanı kullanarak öneririm. Bu veritabanları için tam olarak ne olduğunu ve bu bir daha waaaay iyi php yapabilirsiniz.