2017-02-15 2 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 лет.

Ожидаемый результат:

Фред 20 лет

Фред 30 лет.

Я попытался array_keys(), но я не понимаю, php.net очень хорошо

Если я пытаюсь сохранить результаты в отдельном массиве, а затем цикл, который для печати? Похоже, должно быть более эффективное/элегантное решение.

+0

Используйте in_array() вместо array_search() – Gulshan

ответ

1

@Ben Прежде всего array_search() возвращают истинное или ложное не ключ, но для желаемого результата вы можете просто попробовать с foreach() с условием иона, как показано ниже, или с 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"; 
    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"; 
    } 

ВЫВОД:

Фред: 20 лет.

Fred: 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>'; 
} 

Выход

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/>"; 
    } 
} 

я подрезал свое имя и написал пользовательскую функцию поиска массива согласно вашему требованию.

Попробуйте, это сработает.

Смежные вопросы