2017-02-15 8 views
2

私はarray_searchで遊んでいます。私は配列を検索して詳細を取得しようとしています。問題は、移動した結果が見つかると、配列内の重複をチェックしないということです。私は私のループロジック、任意の提案をうまくいくように見えることはできません?array_searchを使用しますが、結果が見つかったら検索を続行します(PHP)

$names配列

Array(
    [0] => Array 
     (
      [name] => Fred 
      [age] => 20 
     ) 
    [1] => Array 
     (
      [name] => George 
      [age] => 17 
     ) 
    [2] => Array 
     (
      [name] => Sarah 
      [age] => 22 
     ) 
    [3] => Array 
     (
      [name] => Fred 
      [age] => 30 
     ) 
) 
$name=" Fred"; 
//loop here 
$array_position = array_search($name, array_column($names, 'name')); 
$array_data = $names[$array_position]; 

echo $array_data['name'] . " is: " . $array_data['age'] . " years old. 
//end loop 

結果:

フレッドは20歳です。

期待される結果:

フレッドはフレッドが30歳

20歳です。

は私が array_keys()を試してみましたが、私はphp.netを理解していない非常によく

私はその後、印刷するループを別の配列に結果を保存しようとするべきでしょうか?より効率的で洗練されたソリューションが必要なようです。

+0

array_search()の代わりにin_array()を使用します。 – Gulshan

答えて

1

@Ben()がtrueまたはfalseではないキーを返しますが、あなたが望む出力を得るには、単にconditを使ってforeach()を試してみてください以下のようなまたはarray_keyとイオン:

foreachのと()

<?php 
    $names = array(0 => 
       array(    
         "name" => "Fred", 
         "age" => 20 
        ), 
       1 => array(
         "name" => "George", 
         "age" => 17 
        ), 
       2 => array(
         "name" => "Sarah", 
         "age" => 22 
        ), 
       3 => array(
         "name" => "Fred", 
         "age" => 30 
        ) 
      ); 

    $name= "Fred"; 
    echo "<pre>"; 
    foreach($names as $val){ 
     if($val["name"] == $name){ 
      echo $name . " is: " . $val["age"] . " years old.\n"; 
     } 
    } 

array_keyと()

<?php 
    $names = array(0 => 
       array(    
         "name" => "Fred", 
         "age" => 20 
        ), 
       1 => array(
         "name" => "George", 
         "age" => 17 
        ), 
       2 => array(
         "name" => "Sarah", 
         "age" => 22 
        ), 
       3 => array(
         "name" => "Fred", 
         "age" => 30 
        ) 
      ); 
    $name=" Fred"; 
    $array_position = array_keys(array_column($names, "name"), "Fred"); 
    foreach($array_position as $key){ 
     echo $names[$key]["name"] . " is: " . $names[$key]["age"] . " years old.\n"; 
    } 

OUTPUT:

フレッドは次のとおりです。20歳。

フレッドは30歳です。

1

単純なforeachループで何が問題になっていますか?

// Declare the array 
$names = array(
    array(
     'name' => 'Fred', 
     'age' => 20 
    ), 
    array(
     'name' => 'George', 
     'age' => 17 
    ), 
    array(
     'name' => 'Sarah', 
     'age' => 22 
    ), 
    array(
     'name' => 'Fred', 
     'age' => 30 
    ) 
); 

// Name to search 
$name = 'Fred'; 

foreach($names as $index => $data){ 
    if($data['name'] == $name) 
     echo $data['name'] . ' is ' . $data['age'] . ' years old.<br>'; 
} 

、結果は次のようになります。すべて見つけるため

Fred is 20 years old. 
Fred is 30 years old. 
2

使用array_filter。

function search($array, $key) 
{ 
    return array_filter($array, function($v) use($key){return $v['name'] == $key;}); 
} 

$result = search($array, $key); 
foreach($result as $v) 
{ 
    echo $v['name'] . " is: " . $v['age'] . " years old."; 
} 
1

array_keys()はこれを行うことができます:

<?php 
$names = array(
    array(
     'name' => 'Fred', 
     'age' => 20 
    ), 
    array(
     'name' => 'George', 
     'age' => 17 
    ), 
    array(
     'name' => 'Sarah', 
     'age' => 22 
    ), 
    array(
     'name' => 'Fred', 
     'age' => 30 
    ) 
); 

$matchKeys = array_keys(array_column($names, 'name'), 'Fred'); 
array_map(function($arrKey) use ($names) { 
    echo $names[$arrKey]['name'] . " is: " . $names[$arrKey]['age'] . " years old.\n"; 
}, $matchKeys); 

結果:

Fred is: 20 years old. 
Fred is: 30 years old. 
0
Array(
    [0] => Array 
     (
      [name] => Fred, 
      [age] => 20 
     ), 
    [1] => Array 
     (
      [name] => George, 
      [age] => 17 
     ), 
    [2] => Array 
     (
      [name] => Sarah, 
      [age] => 22 
     ), 
    [3] => Array 
     (
      [name] => Fred, 
      [age] => 30 
     ) 
) 

$name="Fred"; 

//loop here 
for($i =0; i<count($names); $i++){ 
    if($arr[$i] == $name)echo $name . ' is ' . $names[$i] ."years old.<br>"; 
} 
//end loop 

出力:

Fred is 20 years old 

Fred is 30 years old 
0

T彼の缶の助け -

$check_name= 'Fred'; // set the name to check 
$temp= array_filter($names, function($a) use($check_name) { 
    return $a['name'] === $check_name; // return if matches 
}); 
// loop through the result 
foreach($temp as $v) { 
    echo $v['name'] . ' is ' . $v['age'] . ' years old.<br>'; 
} 

出力全てarray_searchの最初の

Fred is 20 years old. 
Fred is 30 years old. 

Working code

Anonymous function & use keyword

0

$ name変数にスペースを与えた理由を理解していません $ name = "Fred";ここで

は、あなたのコードは、私はあなたの名前をトリミングして、あなたの要件ごとにカスタム列検索機能を書いて、

$name=" Fred"; 
function array_search_custom($needle,$haystack) { 
    $temp = []; 
    foreach($haystack as $key=>$value) { 
     if(trim($needle)===trim($value)) { 
      $temp[] =$key; 

     } 
    } 
    return $temp; 
} 
$name=" Fred"; 
$a_names = array_column($names, 'name'); 
$a_ages = array_column($names, 'age'); 
$array_position = array_search_custom($name, $a_names); 
foreach($a_names as $k => $v){ 
    if($array_position && in_array($k, $array_position)){  
    echo $a_names[$k] . " is: " . $a_ages[$k] . " years old.<br/>"; 
    } 
} 

です。

試してみるとうまくいきます。

関連する問題