2009-01-05 26 views
5

Básicamente Tengo una configuración como la siguiente:Ordenación de una matriz de una matriz de objetos en PHP por valor de clave

Array ( 
[0] => Array ([0] => stdClass Object ([nid] => 1 [title] => title1 [uid] => 1 [parent] => 0 [weight] => -15 [name] => name1 [value] => 0) 
       [1] => stdClass Object ([nid] => 2 [title] => title2 [uid] => 1 [parent] => 0 [weight] => -7 [name] => name2 [value] => 100) 
       [2] => stdClass Object ([nid] => 3 [title] => title3 [uid] => 2 [parent] => 0 [weight] => -1 [name] => name3 [value] => 0) 
       [3] => stdClass Object ([nid] => 4 [title] => title4 [uid] => 2 [parent] => 0 [weight] => 1 [name] => name4 [value] => 80) 
      ) 
) 

Lo que necesito es una manera de ordenar todas las matrices dentro de la gama de los padres por el [ valor] clave en el Objeto. He estado probando durante aproximadamente 2 días con el servicio y diferentes métodos, pero parece que no puedo entenderlo. La tecla [valor] oscilará entre 0 y 100 y necesito que todas las matrices estén ordenadas en orden decreciente (IE: 100 hasta 0).

Respuesta

0

Podría estar equivocado, pero creo que hice algo como esto usando asort() (o asort()). Estaba en una función de búsqueda, donde necesitaba ordenar una matriz bidimensional llena de índices y marcas de tiempo.

No estoy seguro si funcionará en su caso, y lo hice hace mucho tiempo. Sin embargo, quizás te haga comenzar, buena suerte.

13

Uso usort:

function cmp($a, $b) { 
    if ($a->value == $b->value) { 
    return 0; 
    } else { 
    return $a->value < $b->value ? 1 : -1; // reverse order 
    } 
} 

usort($arr, 'cmp'); 
+1

En la cláusula demás, basta con sustituir la primera: con una? return $ a-> value < $b-> value?1: -1; // orden inverso – Jrgns

1
function cmp($a, $b) { 
    return $b->value - $a->value; 
} 

$ary[0] = usort($ary[0], "cmp"); 

Con el fin de ordenar un arreglo sobre la base de que no sea simple valor o clave de nada, es necesario utilizar la función usort y suministrar su propia comparación. Las funciones de comparación deben definirse de manera que si $a es anterior a $b, se devuelve un valor positivo y uno negativo si $b aparece antes de $a (o cero si son iguales). Como está comparando en función de los valores numéricos y desea una clasificación inversa, la forma más sencilla de hacerlo es restar el 'valor' de $a del valor de $b.

3

Una forma de hacerlo es separar la matriz de valores de la matriz de objetos y, por lo tanto, crear dos matrices. Luego puede usar array_multisort para ordenar la matriz de objetos de acuerdo con la otra matriz. He aquí un ejemplo:

<?php 
$array1 = $objectvalues 
$array2 = array(ObjectWithNid1, ObjectWithNid2, ObjectWithNid3, ObjectWithNid4); 
array_multisort($array1, $array2); 
?> 

Se puede utilizar un foreach para recorrer la matriz una vez y crear una nueva matriz con la tecla correspondiente [valor]:

<?php 
foreach($arraywithobjects as $obj) 
{ 
    $objectvalues[] = $obj->getValue(); 
} 
?> 

Esto hará que el valor del objeto y el inserto en otra matriz que puedes usar con el multisort.

Al final, el código se verá así:

<?php 
foreach($arraywithobjects as $obj) 
{ 
    $objectvalues[] = $obj->getValue(); 
} 
$array2 = array(ObjectWithNid1, ObjectWithNid2, ObjectWithNid3, ObjectWithNid4); 
array_multisort($objectvalues, $array2); 
?> 

La primera matriz en el campo array_multisort debería ser la matriz que está utilizando para ordenar la segunda matriz.

También puede agregar otro método de clasificación para esto. Puede leerlos aquí: link text

+0

¡Fui por este enfoque, gracias! –

4

100% lo robaron desde la primera respuesta en esta página. http://us.php.net/manual/en/function.array-multisort.php
Pero esto es lo que estaba buscando.

multisort una matriz de objetos:

example object [$object with array of objects]: (class: test) 
---------------------------------- 

test Object (
    [Artikel] => Array (
     [0] => test Object (
      [id] => 1 
      [title] => CCCC 
     ) 
     [1] => test Object (
      [id] => 2 
      [title] => AAAA 
     ) 
     [2] => test Object (
      [id] => 3 
      [title] => DDDD 
     ) 
     [3] => test Object (
      [id] => 4 
      [title] => BBBB 
     ) 
    ) 
) 

---------------------------------- 

Simple PHP function: sort_arr_of_obj() 

<?php 
// -------------------------------------- 

/* 
* -------- function arguments -------- 
* $array ........ array of objects 
* $sortby ....... the object-key to sort by 
* $direction ... 'asc' = ascending 
* -------- 
*/ 

function sort_arr_of_obj($array, $sortby, $direction='asc') { 

    $sortedArr = array(); 
    $tmp_Array = array(); 

    foreach($array as $k => $v) { 
     $tmp_Array[] = strtolower($v->$sortby); 
    } 

    if($direction=='asc'){ 
     asort($tmp_Array); 
    }else{ 
     arsort($tmp_Array); 
    } 

    foreach($tmp_Array as $k=>$tmp){ 
     $sortedArr[] = $array[$k]; 
    } 

    return $sortedArr; 

} 


// -------------------------------------- 
?> 

example call: 
---------------------------------- 

<?php 

$sorted->Artikel = sort_arr_of_obj($object->Artikel,'title','asc'); 

?> 

example result: $sorted (class: test) 
---------------------------------- 

test Object (
    [Artikel] => Array (
     [0] => test Object (
      [id] => 2 
      [title] => AAAA 
     ) 
     [1] => test Object (
      [id] => 4 
      [title] => BBBB 
     ) 
     [2] => test Object (
      [id] => 1 
      [title] => CCCC 
     ) 
     [3] => test Object (
      [id] => 3 
      [title] => DDDD 
     ) 

    ) 
) 
+1

gracias por esto – Ponce

+1

Acabo de encontrar esta solución. ¡Funciona para mí también! Gracias :) Tuve que modificarlo muy levemente, ya que estaba devolviendo arreglos vacíos para mí. $ tmp_Array [$ k] = strtolower ($ v -> $ sortby); – WastedSpace

Cuestiones relacionadas