¿Es posible en PHP hacer algo como esto? ¿Cómo harías para escribir una función? Aquí hay un ejemplo. El orden es lo más importante.
$customer['address'] = '123 fake st';
$customer['name'] = 'Tim';
$customer['dob'] = '12/08/1986';
$customer['dontSortMe'] = 'this value doesnt need to be sorted';
Y me gustaría hacer algo como
$properOrderedArray = sortArrayByArray($customer, array('name', 'dob', 'address'));
Porque al final uso un foreach () y no están en el orden correcto (porque agrego los valores a una cadena que debe estar en el orden correcto y no sé de antemano todas las teclas de matriz / valores).
He examinado las funciones de matriz interna de PHP, pero parece que solo puede ordenar alfabéticamente o numéricamente.
Ahí tienes:
fuente
array_merge()
!usort()
ouasort()
?break
declaración una vez que se haya encontrado el valor.array_merge()
con el+
operador de matriz . Se fusiona por tecla (también para teclas numéricas) y de izquierda a derecha , mientras que searray_merge
fusiona de derecha a izquierda y nunca sobrescribe las teclas numéricas. Por ejemplo,[0,1,2]+[0,5,6,7] = [0,1,2,7]
whilearray_merge([0,1,2],[0,5,6,7]) = [0,1,2,0,5,6,7]
y['a' => 5] + ['a' => 7] = ['a' => 5]
butarray_merge(['a' => 5], ['a' => 7]) = ['a' => 7]
.+
letrero?¿Qué tal esta solución?
fuente
O(n * log n)
, entonces este algoritmo se ejecutaO(n^2 * log(n))
.Otra forma para PHP> = 5.3.0:
Resultado:
Funciona bien con cadenas y teclas numéricas.
fuente
array_replace()
que la intención de transmitir es mejor quearray_merge()
.array_replace
también deja el tipo variable intacto. Si uno de los valores de su matriz hubiera sido(string) '1'
y hubiera utilizado el+
operador, el valor se habría convertido en(int) 1
array_merge()
¿solo las agregaría?). La lógica está muy bien explicada aquí . Primero ,array_flip()
cambia los valores de la matriz $ order a claves. Segundo ,array_replace()
reemplaza los valores de la primera matriz con valores que tienen las mismas claves en la segunda matriz. Si necesita ordenar una matriz de acuerdo con las claves de otra, ni siquiera tiene que usarlaarray_flip
.fuente
Tome una matriz como su orden:
Puede ordenar otra matriz en función de los valores utilizando
array_intersect
Documentos :O, en su caso, para ordenar por claves, use
array_intersect_key
Documentos :Ambas funciones mantendrán el orden del primer parámetro y solo devolverán los valores (o claves) de la segunda matriz.
Entonces, para estos dos casos estándar, no necesita escribir una función por su cuenta para realizar la clasificación / reorganización.
fuente
Utilicé la solución Darkwaltz4 pero usé en
array_fill_keys
lugar dearray_flip
, para rellenarNULL
si una clave no está configurada$array
.fuente
Sin magia ...
fuente
$dataset
para que coincida con el nombre del parámetroSI tiene una matriz en su matriz, tendrá que adaptar un poco la función de Eran ...
fuente
Esta función devuelve una matriz sub y ordenada basada en el segundo parámetro $ keys
Ejemplo:
fuente
PHP tiene funciones para ayudarlo con esto:
Usort hace todo el trabajo por usted y array_search proporciona las claves. array_search () devuelve falso cuando no puede encontrar una coincidencia, por lo que los elementos que no están en la matriz de clasificación se mueven naturalmente al final de la matriz.
Nota: uasort () ordenará la matriz sin afectar las relaciones clave => valor.
fuente
Código:
fuente
Primera sugerencia
Segunda sugerencia
Quería señalar que ambas sugerencias son increíbles. Sin embargo, son manzanas y naranjas. ¿La diferencia? Uno es amigable no asociativo y el otro es amigable asociativo. Si está utilizando 2 matrices totalmente asociativas, la combinación / volteo de matrices realmente combinará y sobrescribirá la otra matriz asociativa. En mi caso, ese no es el resultado que estaba buscando. Utilicé un archivo settings.ini para crear mi matriz de orden de clasificación. La matriz de datos que estaba ordenando no necesitaba ser reescrita por mi contraparte de clasificación asociativa. Por lo tanto, la combinación de matrices destruiría mi matriz de datos. Ambos son excelentes métodos, ambos necesitan ser archivados en cualquier caja de herramientas de desarrolladores. Según sus necesidades, puede encontrar que realmente necesita ambos conceptos en sus archivos.
fuente
Adopté la respuesta de @ Darkwaltz4 por su brevedad y me gustaría compartir cómo adapté la solución a situaciones en las que la matriz puede contener diferentes claves para cada iteración de esta manera:
y mantuvo una "clave maestra" de esta manera:
array_merge habría ejecutado la fusión en la iteración Array [1] basada en $ master_key y producido ['some_key'] = '', un valor vacío, para esa iteración. Por lo tanto, array_intersect_key se usó para modificar $ master_key en cada iteración de la siguiente manera:
fuente
Un poco tarde, pero no pude encontrar la forma en que lo implementé, esta versión necesita cierre, php> = 5.3, pero podría modificarse para no:
Por supuesto, 'dontSortMe' necesita ser resuelto, y puede aparecer primero en el ejemplo
fuente