2009-05-13 27 views
28

tarafından bir dizi öğenin dizinini alın:PHP bu dizi var değere

array(
    [0] => array('username' => 'user1') 
    [1] => array('username' => 'user2') 
) 

Ben bir sayı olarak endeks değeri elde nasıl 'kullanıcı adı' dizesi varsa?

Örnek: 'user1' varsa, nasıl 0 alabilirim?

cevap

25

, sen şeyleri biraz özelleştirmek gerekir:

function array_search2d($needle, $haystack) { 
    for ($i = 0, $l = count($haystack); $i < $l; ++$i) { 
     if (in_array($needle, $haystack[$i])) return $i; 
    } 
    return false; 
} 

$myArray = array(
    array('username' => 'user1'), 
    array('username' => 'user2') 
); 
$searchTerm = "user1"; 

if (false !== ($pos = array_search2d($searchTerm, $myArray))) { 
    echo $searchTerm . " found at index " . $pos; 
} else { 
    echo "Could not find " . $searchTerm; 
} 

Eğer isteseydik PHP yardım dosyasından

Sadece belirli bir alanda arama yapın, işlevi aşağıdaki gibi bir şeye değiştirebilirsiniz:

+2

Diziyi for/count döngüsü ile döngülemek yerine - neden "foreach ($ haystack $ anahtar => $ değer olarak") - ayrıca, bu sadece "kullanıcı adı" nı değil, "kullanıcı adı" nı da ( – gnarf

+0

Oh) bulur. OP, sorunun bu yönüyle ilgili biraz belirsizdi. Şimdi düzenleyeceğim. – nickf

+0

Çok güzel bir çözüm +1 – nikhil

27

array_search'a bir bakın. Eğer örnekte olduğu gibi bir 2D dizi varsa

<?php 
$array = array(0 => 'blue', 1 => 'red', 2 => 'green', 3 => 'red'); 

$key = array_search('green', $array); // $key = 2; 
$key = array_search('red', $array); // $key = 1; 
?> 
+2

2B dizisine sahip olduğu için bu onun için çalışmayacaktır. Yine de ... garip bir şekilde kabul edildi. – nickf

+0

Evet, üzgünüm çok erken kabul ettim. Bir 2D dizi ile nasıl yapılacağı hakkında bir fikrin var mı? – roflwaffle

+1

@nickf, aslında sorunun başlığını yanıtlıyor, aslında vücuduna cevap vermediğini düşündü. –

2

array_filter ve array_keys birlikte yardımcı olacaktır.

Sınıf Tabanlı Yaklaşım.

<?php 

class ArraySearch2d { 
    static protected $_key; 
    static protected $_value; 

    static function isMatch($element) 
    { 
    if (!is_array($element)) return false; 
    return $element[self::$_key] == self::$_value; 
    } 

    static function filter(array $arrayToSearch, $key, $value) 
    { 
    if (!is_string($key)) throw new Exception("Array Key must be a string"); 
    self::$_key = $key; 
    self::$_value = $value; 
    return array_filter($arrayToSearch, 'ArraySearch2d::isMatch'); 
    } 

    // to directly answer your question. 
    static function getIndex(array $arrayToSearch, $key, $value) 
    { 
    $matches = self::filter($arrayToSearch, $key, $value); 
    if (!count($matches)) return false; 
    $indexes = array_keys($matches); 
    return $indexes[0]; 
    } 
} 

$array = array("1"=>array('username'=>'user1'), "3"=>array('username'=>'user2')); 

$matches = ArraySearch2d::filter($array, 'username', 'user2'); 
var_dump($matches); 

$indexs = array_keys($matches); 
var_dump($indexs); 

// Demonstrating quick answer: 
echo "Key for first 'username'=>'user1' element is: " 
    .ArraySearch2d::getIndex($array, 'username', 'user1')."\n"; 

üretir:

array(1) { 
    [3]=> 
    array(1) { 
    ["username"]=> 
    string(5) "user2" 
    } 
} 
array(1) { 
    [0]=> 
    int(3) 
} 
Key for first 'username'=>'user1' element is: 1 

sınıfları kullanarak olmadan - bu aynı sonucu üretir:

<?php 
$field="username"; 
$value = "user2"; 

function usernameMatch($element) 
{ 
    global $field, $value; 
    if (!is_array($element)) return false; 
    return $element[$field] == $value; 
} 

function getFirstIndex(array $array) 
{ 
    if (!count($array)) return false; 
    $indexes = array_keys($array); 
    return $indexes[0]; 
} 

$array = array("1"=>array('username'=>'user1'), "3"=>array('username'=>'user2')); 

$matches = array_filter($array, 'usernameMatch'); 
var_dump($matches); 

$indexs = array_keys($matches); 
var_dump($indexs); 


// Demonstrating quick answer - and why you should probably use the class- 
// you don't want to have to remember these "globals" all the time. 
$field = 'username'; 
$value = 'user1'; 

echo "Key for first 'username'=>'user1' element is: " 
    .getFirstIndex(array_filter($array, 'usernameMatch')); 
+0

kesinlikle bir Sınıfı uygulamak veya globals kullanmak zorunda olmanız gerçeği, bunların büyük yaklaşımlar olmadığı anlamına mı geliyor? Sadece bir döngü kullanırsanız, birkaç satırlık kodla mümkündür. – nickf

+0

Cevabını görene kadar basit bir foreach düşünmüyordu :) - İyi iş – gnarf

6

Eğer biliyorsanız Bu

private function getArrayKey($haystack, $needle) 
{ 
    foreach($haystack as $key => $product) 
    { 
    if ($product['id'] === $needle) 
    return $key; 
    } 

    return false; 
} 
2

çok basit olurdu anahtar username, arama parametresi olarak bir dizi kullanmanız yeterlidir: