Как мне отфильтровать 2d-массив php, чтобы получить элементы с атрибутом name, который содержит поисковый запрос в виде подстановочного знака? - PullRequest
0 голосов
/ 05 ноября 2018

Мой двумерный массив выглядит так:

        $users = [ 
                   [name: "John Doe", email: 'e@e.com'], 
                   [name: 'Patrice', email: 'pt@ex.com']
                 ];

Я пытаюсь написать функцию, которая возвращает массив только элементов, содержащих запрос в атрибуте имени

Например:

         //if $q= 'e', the function will return the original array as both array elements have the substring 'e' in the value of the name attribute.
         //if an empty string or no parameter for the query search , return the unadulterated original array.

В основном я пытаюсь использовать функцию, похожую на следующую, за исключением того, что она работает с предопределенным массивом, а не с базой данных;

  // Similar Function but with database
 function fetch_data($query)
 {
  $this->db->like('student_name', $query);
  $query = $this->db->get('tbl_student');
  if($query->num_rows() > 0)
  {
   foreach($query->result_array() as $row)
   {
    $output[] = array(
     'name'  => $row["student_name"],
     'image'  => $row["image"]
    );
   }
   echo json_encode($output);
  }
 }
}

Я новичок в php и CodeIgniter, и я пытаюсь сделать автозаполнение с этим.

Ответы [ 3 ]

0 голосов
/ 05 ноября 2018

Вы можете использовать array_filter для сортировки элементов массива, используя stripos (без учета регистра) для поиска строки поиска:

$users = [ 
           ['name'  => "John Doe", 'email'  => 'e@e.com'], 
           ['name'  => 'Patrice', 'email'  => 'pt@ex.com']
         ];
function fetch_data($data, $search) {
    return array_filter($data, function ($v) use ($search) { return stripos($v['name'], $search) !== false; });
}
print_r(fetch_data($users, 'e'));

Выход:

Array ( 
    [0] => Array ( [name] => John Doe [email] => e@e.com )
    [1] => Array ( [name] => Patrice [email] => pt@ex.com ) 
)

print_r(fetch_data($users, 'p'));

Выход:

Array ( 
    [1] => Array ( [name] => Patrice [email] => pt@ex.com ) 
)

Демонстрация на 3v4l.org

0 голосов
/ 05 ноября 2018

если хотите массив такой

$users = [ 
            name: "John Doe", 
            name: 'Patrice',
         ];

тогда не нужно лишнего цикла, напрямую используйте вот так:

$this->db->select("student_name as name,image");
$this->db->like('LOWER(student_name)',strtolower($query['name']));
$data = $this->db->get('tbl_student')->result_array();
$student_name=array();
if(count($data)>0)
{
    $student_name=array_column($data,'name');   
}

return $student_name;
0 голосов
/ 05 ноября 2018

Вы можете сделать это,

$search_string = "e";
$keys = preg_grep("/$search_string/i", array_column($users, 'name'));

$result = [];
foreach($keys as $key => $value)
{
    $result[] = $users[$key];
}
//return $result to your autocomplete.

PHP Документация на preg_grep и array_column

Я проверил код.

Тест здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...