Search code examples
phparrayssortingarray-multisort

array_multisort how to mount with foreach


I need to mount an array_multisort with the values from one array. I tryied to mount a string concated and call on the array_multidimensional like here:

function ordenar_matriz_ultima_posicion_por_distancia($matriz_up,$m_vehiculo_distancias){

  $total_vehiculos=count($matriz_up[id_vehiculo]);
  //resetear las keys de vehiculos para coger bien los kms y asignarlos
  $a_vehiculo_distancia = array_values($m_vehiculo_distancias);
  $ordenar = array();

    foreach ($a_vehiculo_distancia as $key) {
        $ordenar[] = $key;
    }

  sort($m_vehiculo_distancias);

  $string= "";
  $ultim_key = end(array_keys($matriz_up));
  foreach ($matriz_up as $key => $valor) {

     if ($key != $ultim_key) $string.= $matriz_up[$key].',';
     else $string.= $matriz_up[$key];

     $aaa = '$matriz_up[$key]';
    }

    echo $string;
    echo "<br>";

    array_multisort($ordenar, SORT_ASC, $string);


    for($i=0;$i<$total_vehiculos;$i++){
       $matriz_up['cercanos'][$i] = $m_vehiculo_distancias[$i];

    echo $matriz_up['id_vehiculo'][$i]."<br>";
    echo $matriz_up['fecha_gps'][$i]."<br>";
    echo $matriz_up['id_tipo_posicion'][$i]."<br>";
    echo $matriz_up['cercanos'][$i]."<br>";
    echo $matriz_up['vaina'][$i]."<br>";
    echo "------------<br>";
    }

  return $matriz_up;
}

$matriz_up['id_vehiculo'][0] = 9;
$matriz_up['fecha_gps'][0] = '2014';
$matriz_up['id_tipo_posicion'][0] = 11111;
$matriz_up['cercanos'][0] = 0;
$matriz_up['vaina'][0] = 12345;

$matriz_up['id_vehiculo'][1] = 3;
$matriz_up['fecha_gps'][1] = '2015';
$matriz_up['id_tipo_posicion'][1] = 22222;
$matriz_up['cercanos'][1] = 0;
$matriz_up['vaina'][1] = 5555;

$matriz_up['id_vehiculo'][2] = 1;
$matriz_up['fecha_gps'][2] = '2016';
$matriz_up['id_tipo_posicion'][2] = 33333;
$matriz_up['cercanos'][2] = 0;
$matriz_up['vaina'][2] = 988;

$matriz_up['id_vehiculo'][3] = 4;
$matriz_up['fecha_gps'][3] = '2017';
$matriz_up['id_tipo_posicion'][3] = 44444;
$matriz_up['cercanos'][3] = 0;
$matriz_up['vaina'][3] = 777;


  $m_vehiculo_distancias[9] = 345;
  $m_vehiculo_distancias[3] = 712;
  $m_vehiculo_distancias[1] = 10;
  $m_vehiculo_distancias[4] = 35;
ordenar_matriz_ultima_posicion_por_distancia($matriz_up,$m_vehiculo_distancias);

With this array_multisort works, but i need to take all the key without put manually..

array_multisort($ordenar, SORT_ASC, $matriz_up['id_vehiculo'], $matriz_up['fecha_gps'], $matriz_up['id_tipo_posicion'], $matriz_up['vaina'] );

Solution

  • Try this code:

    <?php
    
    $matriz_up = $m_vehiculo_distancias = array();
    
    $matriz_up['id_vehiculo'][0] = 9;
    $matriz_up['fecha_gps'][0] = '2014';
    $matriz_up['id_tipo_posicion'][0] = 11111;
    $matriz_up['cercanos'][0] = 0;
    $matriz_up['vaina'][0] = 12345;
    
    $matriz_up['id_vehiculo'][1] = 3;
    $matriz_up['fecha_gps'][1] = '2015';
    $matriz_up['id_tipo_posicion'][1] = 22222;
    $matriz_up['cercanos'][1] = 0;
    $matriz_up['vaina'][1] = 5555;
    
    $matriz_up['id_vehiculo'][2] = 1;
    $matriz_up['fecha_gps'][2] = '2016';
    $matriz_up['id_tipo_posicion'][2] = 33333;
    $matriz_up['cercanos'][2] = 0;
    $matriz_up['vaina'][2] = 988;
    
    $matriz_up['id_vehiculo'][3] = 4;
    $matriz_up['fecha_gps'][3] = '2017';
    $matriz_up['id_tipo_posicion'][3] = 44444;
    $matriz_up['cercanos'][3] = 0;
    $matriz_up['vaina'][3] = 777;
    
    
    $m_vehiculo_distancias[9] = 345;
    $m_vehiculo_distancias[3] = 712;
    $m_vehiculo_distancias[1] = 10;
    $m_vehiculo_distancias[4] = 35;
    
    
    function sortArray($arrayToSortParam, $orderArray)
    {
        $result = array();
        $arrayToSort = $arrayToSortParam;
    
        $keys = array_keys($arrayToSort);
    
        asort($orderArray, true);
    
    
        $newSort = $cercanos = array();
        foreach($orderArray as $key => $value)
        {
            $newSort[] = array_keys($arrayToSort['id_vehiculo'], $key)[0];
            $cercanos[] = $orderArray[$key];
        }
    
        foreach($keys as $keyName)
        {
            uksort($arrayToSort[$keyName], function($key1, $key2) use ($newSort) {
                return (array_search($key1, $newSort) > array_search($key2, $newSort));
            });
        }
    
        $arrayToSort['cercanos'] = $cercanos;
    
        //reset indexes
        foreach($keys as $keyName)
        {
            $arrayToSort[$keyName] = array_values($arrayToSort[$keyName]);
        }
    
        return $arrayToSort;
    
    }
    
    
    echo '<pre>';
    //print_r($matriz_up);
    //print_r($m_vehiculo_distancias);
    
    print_r(sortArray($matriz_up, $m_vehiculo_distancias)); //this is result
    

    Working fiddle: CLICK!