(PHP) ¿Cómo ordenar una matriz multidimensional con cadenas relacionadas con una variable?

2022-10-06 23:24:12

Oye, tengo una nueva función en mi sitio web en la que puedes busque sus artículos ingresando algunas palabras clave en la entrada de búsqueda. Por supuesto, estoy usando ajax y necesito una nueva función que clasifique u ordene la matriz que contiene la información del elemento de la base de datos relacionada con la palabra clave que el usuario escribe en el campo de entrada. Cuando el usuario presiona, por ejemplo, "m", entonces debería mostrarse de esta manera.

array [["836","123","Malaga - Ocean","1"],
       ["834","123","Malaga City","1"],
       ["838","123","DayZ - Novo Turm #1","0"],
       ["839","123","DayZ - Novo Turm #2","0"],
       ["840","123","DayZ - Novo Turm #3","0"]]

Pero si estoy buscando algo que comience con la letra "m", "Málaga Ciudad" y "Málaga - Océano" deberían aparecer primero en el resultado.

Estoy buscando en más de una tabla la palabra clave donde la recopilo. Pero si estoy agregando la matriz en cada resultado de tabla diferente, lo obtengo cada vez que la tabla de imágenes aparece primero.

MySql:

$sql_picture = "SELECT * FROM pictures [...] ORDER BY name LIMIT 5";
$sql_videos = "SELECT * FROM videos [...] ORDER BY name LIMIT 5";
$sql_audio = "SELECT * FROM audio [...] ORDER BY name LIMIT 5";
$sql_documents = "SELECT * FROM documents [...] ORDER BY name LIMIT 5";

PHP:

$collectedDataName = array();

for($i = 0; $i < count($collectData); $i++){
    $collectedDataName[$i] = $collectData[$i][2];
}

$collectData_lowercase = array_map('strtolower', $collectedDataName);

array_multisort($collectData_lowercase, SORT_ASC, SORT_STRING, $collectedDataName);

$returnData = array();

for($j = 0; $j < 5; $j++){
    for($i = 0; $i < count($collectData); $i++){
        if($collectData[$i][2] === $collectedDataName[$j]){
            $returnData[$j] = $collectData[$i];
        }
    }
}

echo json_encode($returnData);

Resultado:

array [["838","123","DayZ - Novo Turm #1","0"],
      ["839","123","DayZ - Novo Turm #2","0"],
      ["840","123","DayZ - Novo Turm #3","0"],
      ["836","123","Malaga - Ocean","1"],
      ["834","123","Malaga City","1"]]

¿Cómo puedo ordenar mi matriz multidimensional por su valor de cadena relacionado con una variable?

- user2628521

Source
zh
Responder


2
  • Desea ordenar su matriz multidimensional según el valor de entrada, un poco como lo hacemos en sql usando

    select * from table where column like 'inputValue%'
    

    Esta es una solución basada únicamente en php

    $inputvalue = 'm';
    $inputvalue = strtolower($inputvalue);
    
    $collectData = [["838","123","DayZ - Novo Turm #1","0"],
                 ["834","123","Malaga City","1"],
                 ["839","123","DayZ - Novo Turm #2","0"],         
                 ["836","123","Malaga - Ocean","1"],
                 ["840","123","DayZ - Novo Turm #3","0"],
                ];
    
    /*
    we use strpos to check if the input value is contained in the strings array, if not we use levenshtein to calculate the distance between them.*/
    
    $distances = array();
    $positions = array();
    for ($i=0; $i < count($collectData); $i++) {    
      $current_val = strtolower($collectData[$i][2]);
      if (strpos($current_val, $inputvalue)!==false)
        $distance = strpos($current_val, $inputvalue);
      else
        $distance = levenshtein($inputvalue, $current_val);
    
      $distances[] = $distance;        
      $positions[] = array("distance"=>$distance, "position"=>$i);        
    }
    
    /*we sort distances*/
    sort($distances);
    
    /* we reorder collectData based on distances sort  */
    $returnData = array();
    for ($j=0; $j<count($distances); $j++) {
      for ($k=0; $k<count($positions); $k++) {
        $val = $collectData[$positions[$k]["position"]];
    
        if ($distances[$j]==$positions[$k]["distance"] && !in_array($val, $returnData)) {
            $returnData[] = $val;
            break;
        }
      }
    }
    
    return $returnData;
    

    documento php de levenshtein aquí: función de levenshtein