自定义数组按输入字符串和位置排序

I have an array. It' looks like:

$arr = [
   '0' => ['id'=>9, 'q'=>'motor', 'pos'=>1],
   '1' => ['id'=>10, 'q'=>'NULL', 'pos'=>0],
   '2' => ['id'=>7, 'q'=>'motor', 'pos'=>2],
   '3' => ['id'=>8, 'q'=>'NULL',  'pos'=>0],
   '4' => ['id'=>11, 'q'=>'motor','pos'=>3],
   '5' => ['id'=>11, 'q'=>'exhaust','pos'=>1]
];

How can I sort the data above to make it looks like (if q='motor' is inside search string):

 $arr = [
       '0' => ['id'=>9, 'q'=>'motor', 'pos'=>1],
       '2' => ['id'=>7, 'q'=>'motor', 'pos'=>2],
       '4' => ['id'=>11, 'q'=>'motor','pos'=>3],
       '1' => ['id'=>10, 'q'=>'NULL', 'pos'=>0],
       '3' => ['id'=>8, 'q'=>'NULL',  'pos'=>0],
       '5' => ['id'=>11, 'q'=>'exhaust','pos'=>1]
    ];

So:

function custom_sort($input_query, $arr) {
   foreach($arr as $key=>$row) {
      if (strpos($input_query, $row['q'])) {
          ... How to Sort By Pos?
      }
   }
}

Thanks!

Updated (question/answer) p.s: I'm trying to use custom variable as input: $q

usort($arr, function($a, $b) use ($q) {
        if ($a['q'] == $q) {
            if($b['q'] == $q) {
                return ($a['pos'] > $b['pos']) ? 1 : -1;
            }
            return -1;
        }
        if ($b['q'] == $q) {
            return 1;
        }
        return 0;
    });

And the function stop working. How can I solve this?

展开翻译

译文

我有一个数组。 它看起来像:</ p>

  $ arr = [
'0'=&gt; ['id'=&gt; 9,'q'=&gt;'motor','pos'=&gt; 1],
'1'=&gt; ['id'=&gt; 10,'q'=&gt;'NULL','pos'=&gt; 0],
'2'=&gt; ['id'=&gt; 7,'q'=&gt;'motor','pos'=&gt; 2],
'3'=&gt; ['id'=&gt; 8,'q'=&gt;'NULL','pos'=&gt; 0],
'4'=&gt; ['id'=&gt; 11,'q'=&gt;'motor','pos'=&gt; 3],
'5'=&gt; ['id'=&gt; 11,'q'=&gt;'排气','pos'=&gt; 1]
];
</ code> </ pre>

怎么能 我对上面的数据进行排序使它看起来像(如果q ='motor'在搜索字符串内):</ p>

  $ arr = [
'0'=&gt; ['id'=&gt; 9,'q'=&gt;'motor','pos'=&gt; 1],
'2'=&gt; ['id'=&gt; 7,'q'=&gt;'motor','pos'=&gt; 2],
'4'=&gt; ['id'=&gt; 11,'q'=&gt;'motor','pos'=&gt; 3],
'1'=&gt; ['id'=&gt; 10,'q'=&gt;'NULL','pos'=&gt; 0],
'3'=&gt; ['id'=&gt; 8,'q'=&gt;'NULL','pos'=&gt; 0],
'5'=&gt; ['id'=&gt; 11,'q'=&gt;'排气','pos'=&gt; 1]
];
</ code> </ pre>

所以: </ p>

  function custom_sort($ input_query,$ arr){
foreach($ arr as $ key =&gt; $ row){
if(strpos($ input_query,$ row ['q'])){
...如何按位排序?
}
}
}
</ code> </ pre>

谢谢!</ p>

更新(问题/答案)</ strong>
ps:我正在尝试使用自定义变量作为输入:$ q </ em> </ p>

  usort($ arr,function($ a,$ b)use($ q){
if($ a ['q'] == $ q){
if(if $ b ['q'] == $ q){
return($ a ['pos']&gt; $ b ['pos'])?1:-1;
}
返回-1; \ n}
if($ b ['q'] == $ q){
return 1;
}
返回0;
});
</ code> </ pre>
\ n

功能停止工作。 我该如何解决这个问题?</ p>
</ div>

donglei3370
donglei3370 是。谢谢!
大约一年之前 回复
doulu6160
doulu6160 是否应该考虑其他元素的位置!=电机?
大约一年之前 回复

3个回答

Here's a usort that handles your requirements, wrapped in a function that transforms the array in place:

  1. Items with q key containing $query will be placed at the front of the array.

  2. Items with q key containing $query will be sorted ascending by their pos value.

  3. Everything else will be sorted by its pos value.

function custom_sort($query, &$arr) {
    usort($arr, function($a, $b) use ($query) {
        $in_a = strpos($a['q'], $query) !== false;
        $in_b = strpos($b['q'], $query) !== false;

        if ($in_a && !$in_b) {
            return -1;
        }
        if (!$in_a && $in_b) {
            return 1;
        }

        return $a['pos'] - $b['pos'];
    });
}

custom_sort("motor", $arr);

Test it on a large dataset in this repl.

展开翻译

译文



这是一个 usort </ code>,用于处理您的需求,包含在一个转换数组的函数中:</ p>


  1. 包含 $ query </ code>的 q </ code>键的项目将放在数组的前面。</ p> </ li>

  2. 包含 $ query </ code>的 q </ code>键的项目将按其 pos </ code>值递增排序 。</ p> </ li>

  3. 其他所有内容都将按其 pos </ code>值排序。</ p> </ li>
    </ ol>

      function custom_sort($ query,&amp; $ arr){
    usort($ arr,function($ a,$ b)use($ query){
    $ in_a = strpos($ a ['q'],$ query)!== false;
    $ in_b = strpos($ b ['q'],$ query)!== false;
  4. if($ in_a&amp; ;&amp;!$ in_b){
    return -1;
    }
    if(!$ in_a&amp;&amp; $ in_b){
    return 1;
    }

    返回$ a ['pos '] - $ b ['pos'];
    });
    }

    custom_sort(“motor”,$ arr);
    </ code> </ pre>

    测试 它在一个 此 repl 中的大型数据集。</ p>
    </ div>

You can use usort

usort($arr, function($a, $b) {
    if ($a['q'] == 'motor') {
        if($b['q'] == 'motor') {
            return ($a['pos'] > $b['pos']) ? 1 : -1;
        }
        return -1;
    }
    if ($b['q'] == 'motor') {
        return 1;
    }
    return 0;
});

If you need a different order, just change the function to match your needs.

展开翻译

译文



您可以使用 usort </ code> </ p>

  usort($  arr,function($ a,$ b){
if($ a ['q'] =='motor'){
if($ b ['q'] =='motor'){
return ($ a ['pos']&gt; $ b ['pos'])?1:-1;
}
返回-1;
}
if($ b ['q'] ==' motor'){
return 1;
}
返回0;
});
</ code> </ pre>

如果您需要不同的订单,只需更改功能 以满足您的需求。</ p>
</ div>

dtl85148
dtl85148 谢谢! 我试图使用这样的东西:usort($ arr,function($ a,$ b)使用($ q){ - >并将'motor'替换为$ q。上面的函数 - >停止工作。
大约一年之前 回复
douyong8801
douyong8801 效果很好,但开头的索引ID已重置。 如果他们对这项任务无足轻重,我会考虑回答。
大约一年之前 回复
duanji1043
duanji1043 已经编辑过。 这里的工作版本:3v4l.org/4375F
大约一年之前 回复

U sort would help you here

usort( $arr, function ( $a, $b ) {
    if ( $a['q'] === $b['q'] ) {
        return $a['pos'] < $b['pos'] ? -1 : 1;
    }
    if ( $a['q'] === 'motor' ) {
        return -1;
    }
    if ( $b['q'] === 'motor' ) {
        return 1;
    }
    return 0;
} );

展开翻译

译文



U sort会帮助你</ p>

  usort($ arr,function($  a,$ b){
if($ a ['q'] === $ b ['q']){
返回$ a ['pos']&lt; $ b ['pos']? - 1:1;
}
if($ a ['q'] ==='motor'){
return -1;
}
if($ b ['q'] ===' motor'){
return 1;
}
返回0;
});
</ code> </ pre>
</ div>

doubi9255
doubi9255 一切都很好。 我只是想把'motor'替换成输入变量。 而且这不是最简单的部分......
大约一年之前 回复
dtnrsmi824877
dtnrsmi824877 变量只是其中一个提示,返回的位置,ifs的位置,评估的变量。 如果它只是变量我不会考虑任何事情。 但一个看起来几乎相同的封闭,引起了怀疑。 但是,无论如何,这有什么关系? 每个人的答案都有效。 我会选择第一个发布的。
大约一年之前 回复
duanlin1931
duanlin1931 好像它已经解决了。 我经常使用$ a和$ b。 我认为那些变量太短也不能产生相关性。 但是,排序了!
大约一年之前 回复
donkey111111
donkey111111 几乎所有自定义比较器都使用$ a和$ b。 我不认为这里有任何抄袭,如果那是你的建议,尽管此时每个人的答案实际上都是一样的。
大约一年之前 回复
dongyingming8970
dongyingming8970 显然每个人都喜欢$ a,$ b变量。 :)
大约一年之前 回复
dtcrw26206
dtcrw26206 做出改变,当$ b是电机时,我犯了错误,返回-1。 我修好了,现在它按照我最初的预期返回
大约一年之前 回复
duanqie5741
duanqie5741 我认为,由于变量和回报,但是好的,不假设其他人在没有证据的情况下偷走了答案,我道歉。 答案没有提供OP想要的东西。 结果未作为样本订购。
大约一年之前 回复
dongzen5577
dongzen5577 我们大约在同一时间发布。 谢谢你假设我只是偷了他的答案,即使我没有。 他没有考虑OP要求的'pos'。
大约一年之前 回复
doujing3896
doujing3896 在没有引用别人的答案的情况下调整别人的答案是不是很粗鲁?
大约一年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!

相似问题

4
怎么javascrpt语言实现将一个字符串转换为多个字符串构成的数组并且判断每个字符串的数组?
3
C#string数组转int数组异常显示输入字符串不正确?
1
java程序设计(字符串排序)
1
c# 在命令行中输入任意10个字符串,根据字符串类型将输入的数据放入到不同数组中,最后将数组进行排序
1
C语言字符串的排序问题如何解决?
1
编写函数del(char str[])将字符串str中的除头部前导*和后字符数删除后的字符串,
1
用指针数组 对字符串排序,怎么实现?
3
javascrpt语言,二维数组转二维字符串怎么做,网上查不到,没有思路
7
java 在带有数字、字母、字符组成的字符串分割出从数字开始到数字结束的固定字符串
1
C语言求助:输入一个字符串,将其中的字母字符输入一个链表,将其中的数字字符输入另一个链表。
3
获取input标签输入字符串中字母和数字的个数
3
C语言无法读取出指针数组里的字符串
0
输入字符串a,用指针,将其中数字,字母分别剔除并按原来顺序字符串b和c里,最后分别输出a,b,c三个字符串
1
(C语言)输入一个有20个以上字符的字符串,分别统计字符串中字符a和s(只限于小写)的个数,并输出结果。
1
输入一个字符串,可以删除字符串s中的任意字符,剩下的字符串形成对称字符串,且该字符串为最长对称字符串
2
javascript排序字符串中的数值
2
指定位置输出字符串:输入一个字符串后再输入两个字符,输出此字符串中从与第一个字
0
c语言如何读取文本文件中指定的字符串并保存到字符串数组中?
4
按字符串属性值对对象数组排序
1
为什么键盘输入字符串和文件导入字符串都有错?错误应该怎么改?