Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何根据元素中的整数值对元素进行排序?_Php_Mysql_Arrays_Sorting_Integer - Fatal编程技术网

Php 如何根据元素中的整数值对元素进行排序?

Php 如何根据元素中的整数值对元素进行排序?,php,mysql,arrays,sorting,integer,Php,Mysql,Arrays,Sorting,Integer,我需要根据数组包含的整数值对数组元素进行排序 电流输出为: array[0] -> Indica 4 PAX array[1] -> Indigo/swif Dezire/Etios 11 PAX array[2] -> Tavera 8-10 PAX array[3] -> Innova 10 PAX array[4] -> Tempo Traveller 7-9 PAX 但实际上我需要: array[0] -> Indica 4 PAX ar

我需要根据数组包含的整数值对数组元素进行排序

电流输出为:

array[0] -> Indica 4 PAX

array[1] -> Indigo/swif Dezire/Etios  11 PAX

array[2] -> Tavera 8-10 PAX

array[3] -> Innova 10 PAX

array[4] -> Tempo Traveller 7-9 PAX
但实际上我需要:

array[0] -> Indica 4 PAX

array[1] -> Tempo Traveller 7-9 PAX

array[2] -> Tavera 8-10 PAX

array[3] -> Innova 10 PAX

array[4] -> Indigo/swif Dezire/Etios  11 PAX

也许你会喜欢用这个

我刚才引用了一个例子


也许你会喜欢使用这个

我刚才引用了一个例子


您的问题上有
mysql
标记,因此我假设您的数据来自resultset行。我还看到,所有的数值都是字符串中最后的第二个非空白子字符串

因此,使用以下
orderby
子句()

上面的子句说明:隔离最后的第二个子字符串并将其转换为无符号数。这样可以确保执行“自然排序”(这样
12
就不会出现在
3
之前)。作为第二种排序标准,我使用fullstring来打破关系

也就是说,如果您的实际字符串并不总是遵循该结构,那么我接下来推荐
array\u multisort()
,因为它执行的迭代正则表达式函数调用更少

代码:()

你甚至可以把它写成一行:()

*处理连字符数字子字符串的模式调整:
~-\d+\d+~
这将删除非数字字符和连字符后面的数字

所有上述方法都将采用此输入:

$array=[
    'Indica 4 PAX',
    'Indigo/swif Dezire/Etios  11 PAX',
    'Tavera 10 PAX',
    'Innova 10 PAX',
    'Tempo Traveller 9 PAX'
];
并提供以下输出:

array (
  0 => 'Indica 4 PAX',
  1 => 'Tempo Traveller 9 PAX',
  2 => 'Innova 10 PAX',
  3 => 'Tavera 10 PAX',
  4 => 'Indigo/swif Dezire/Etios  11 PAX',
)

您的问题上有
mysql
标记,因此我假设您的数据来自resultset行。我还看到,所有的数值都是字符串中最后的第二个非空白子字符串

因此,使用以下
orderby
子句()

上面的子句说明:隔离最后的第二个子字符串并将其转换为无符号数。这样可以确保执行“自然排序”(这样
12
就不会出现在
3
之前)。作为第二种排序标准,我使用fullstring来打破关系

也就是说,如果您的实际字符串并不总是遵循该结构,那么我接下来推荐
array\u multisort()
,因为它执行的迭代正则表达式函数调用更少

代码:()

你甚至可以把它写成一行:()

*处理连字符数字子字符串的模式调整:
~-\d+\d+~
这将删除非数字字符和连字符后面的数字

所有上述方法都将采用此输入:

$array=[
    'Indica 4 PAX',
    'Indigo/swif Dezire/Etios  11 PAX',
    'Tavera 10 PAX',
    'Innova 10 PAX',
    'Tempo Traveller 9 PAX'
];
并提供以下输出:

array (
  0 => 'Indica 4 PAX',
  1 => 'Tempo Traveller 9 PAX',
  2 => 'Innova 10 PAX',
  3 => 'Tavera 10 PAX',
  4 => 'Indigo/swif Dezire/Etios  11 PAX',
)

如果有两个相同的整数,那么最终可能需要按名称进行子排序

<?php
$data=[
    'Indica 4 PAX',
    'Indigo/swif Dezire/Etios  11 PAX',
    'Tavera 10 PAX',
    'Innova 10 PAX',
    'Tempo Traveller 9 PAX'
];

$int_filter = function($str) {
    return filter_var($str, FILTER_SANITIZE_NUMBER_INT);
};
$sorter = function($a, $b) use ($int_filter) {
    $cmp = $int_filter($a) <=> $int_filter($b);
    if($cmp === 0)
        $cmp = $a <=> $b;

    return $cmp;
};
uasort($data, $sorter);

var_export($data);

如果有两个相同的整数,那么最终可能需要按名称进行子排序

<?php
$data=[
    'Indica 4 PAX',
    'Indigo/swif Dezire/Etios  11 PAX',
    'Tavera 10 PAX',
    'Innova 10 PAX',
    'Tempo Traveller 9 PAX'
];

$int_filter = function($str) {
    return filter_var($str, FILTER_SANITIZE_NUMBER_INT);
};
$sorter = function($a, $b) use ($int_filter) {
    $cmp = $int_filter($a) <=> $int_filter($b);
    if($cmp === 0)
        $cmp = $a <=> $b;

    return $cmp;
};
uasort($data, $sorter);

var_export($data);


我需要根据arrayRaghu中整数值的升序排序打印这个数组,通常你会在问题和预期输入输出旁边显示一些你已经尝试过的代码。这些数字总是整数吗?如果两个不同的元素包含相同的数值,它们的顺序应该是什么?哇,问题参数已更改。现在您需要按整数范围排序。我需要根据arrayRaghu中整数值的升序排序打印此数组,通常您会在问题和预期输入输出旁边显示一些您已经尝试过的代码。这些数字是否始终为整数?如果两个不同的元素包含相同的数值,他们应该按什么顺序来?哇,问题参数已经改变了。现在您想按整数范围排序。为什么要提交两个单独的答案?您可以将它们合并到一个帖子中。正如我所说。不同的方法。我提供了3种不同的方法。为什么要保留索引?OP不希望这样。OP声明他们希望打印数组。索引可能无关紧要,但如果在web表单中使用结果,他们可能需要索引。如果不需要索引,请使用
usort
而不是
uasort
。或者他们总是可以对结果调用
array\u value
。为什么要提交两个单独的答案?您可以将它们合并到一个帖子中。正如我所说。不同的方法。我提供了3种不同的方法。为什么要保留索引?OP不希望这样。OP声明他们希望打印数组。索引可能无关紧要,但如果在web表单中使用结果,他们可能需要索引。如果不需要索引,请使用
usort
而不是
uasort
。或者他们总是可以对结果调用
array\u值
。我喜欢选择顺序的方法。但据我所知,数字联系将导致与其他解决方案略有不同的顺序。(Innova 10人,Tavera 10人,这是我个人的愿望。)我最好重新检查一下我的方法
Innova
应该在
Tavera
之前。OP的例子不能保证这一点,但它可能是一个疏忽。@Progrock发现我唯一一个错误的方法是宇宙飞船操作员的
usort()
方法。(我只是没有准确地发布我的答案)当它是平局时,没有“移动”,所以它像输入一样不正常。阿利维托迪的回答没有显示出这一错误,但这纯粹是运气。他的方法默认在平局上交换。如果输入顺序颠倒,他的答案就不会按字母顺序排序。我删除了我的
usort()
调用,因为它在每次迭代/比较时都会执行两个
preg\u match()
调用,所以效率不高。(我敢说我喜欢preg\u replace/array\u multisort,尽管你确实松开了键。)我喜欢选择顺序的方法。但据我所知,数字联系将导致与其他解决方案略有不同的顺序。(Innova 10人之后是Tavera 10人,就个人而言是wha
<?php

$data =
[
    'Catnip 23 units',
    'Cheezy chips 18 units',
    'Refried beans 21 units' 
];

$int_filter = function($str) {
    return filter_var($str, FILTER_SANITIZE_NUMBER_INT);
};
$int_values = array_map($int_filter, $data);
asort($int_values); // Order int_values and maintain keys.

$ordered = array_replace($int_values, $data);
var_export($ordered);
array (
  1 => 'Cheezy chips 18 units',
  2 => 'Refried beans 21 units',
  0 => 'Catnip 23 units',
)
<?php
$data=[
    'Indica 4 PAX',
    'Indigo/swif Dezire/Etios  11 PAX',
    'Tavera 10 PAX',
    'Innova 10 PAX',
    'Tempo Traveller 9 PAX'
];

$int_filter = function($str) {
    return filter_var($str, FILTER_SANITIZE_NUMBER_INT);
};
$sorter = function($a, $b) use ($int_filter) {
    $cmp = $int_filter($a) <=> $int_filter($b);
    if($cmp === 0)
        $cmp = $a <=> $b;

    return $cmp;
};
uasort($data, $sorter);

var_export($data);
array (
    0 => 'Indica 4 PAX',
    4 => 'Tempo Traveller 9 PAX',
    3 => 'Innova 10 PAX',
    2 => 'Tavera 10 PAX',
    1 => 'Indigo/swif Dezire/Etios  11 PAX',
)