【问题标题】:Loop through PHP array with preference on which to loop through first循环遍历 PHP 数组,优先循环遍历哪个数组
【发布时间】:2019-07-10 02:02:43
【问题描述】:

我有一个简单的数组 $arr,其中的键以不同的顺序以 ab-xy- 开头。我想先用ab- 循环键,然后用xy-

$arr = [
    'ab-283' => 'Hi', // 1 (loop through this first)
    'xy-153' => 'Ok', // 5
    'ab-232' => 'Hello', // 2 (loop this through second...)
    'ab-164' => 'Cool', // 3
    'xy-164' => 'Hmm', // 6
    'ab-164' => 'Yo', // 4
    'xy-164' => 'Yup' // 7
];

foreach ($arr as key => $value) {
}

这将是输出:

Hi
Hello
Cool
Yo
Ok
Hmm
Yup

那么无论如何要先循环遍历ab-,然后循环遍历xy-?谢谢

【问题讨论】:

  • 先排序? foreach 将按顺序进行。
  • ksort($arr);在 foreach 之前

标签: php arrays loops sorting foreach


【解决方案1】:

如果您不希望它完全按键排序(我假设您不希望,因为它与您显示的输出不同),我认为您只需要通过它两次。

foreach (['ab', 'xy'] as $prefix) {
    foreach ($arr as $key => $value) {
        if (substr($key, 0, 2) == $prefix) {
            echo $value;
        }
    }
}

【讨论】:

  • 这种方法会比ksort()更快吗?
  • 好吧,ksort 不会给出你想要的输出。它也将按数字部分排序,而不仅仅是 ab 然后 xy ,每个前缀的元素按原始顺序保留。例如,它会像 Hello, Hi 而不是 Hi, Hello。
  • 如果那真的没关系,那么我会选择 ksort。
  • 我做了一个性能测试,我把它们都放在了for ($x = 0; $x <= 100000; $x++) {ksort()中更快。但是我接受了您的回答,因为我想到了您的那种代码,但就是想不到!谢谢!
  • 不客气!不过,请随意接受最适合您的那个。如果按数字部分排序无关紧要,我更喜欢 ksort 的简单性,无论它是否更快,除非差异很大。此外,在测试这样的性能时,请记住,您要比较的不同方法可能效果更好/更差,具体取决于输入的大小和其他因素,例如它的排序方式。跨度>
【解决方案2】:

你可以先按key对$arr数组进行排序

ksort($arr);

然后foreach。 您的数组多次具有相同的键(xy-164),因此输出与您发布的不同,而是:

array(5) {
  ["ab-164"]=>
  string(2) "Yo"
  ["ab-232"]=>
  string(5) "Hello"
  ["ab-283"]=>
  string(2) "Hi"
  ["xy-153"]=>
  string(2) "Ok"
  ["xy-164"]=>
  string(3) "Yup"
}

【讨论】:

    猜你喜欢
    • 2011-05-23
    • 2012-11-14
    • 2011-04-25
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    • 2013-02-06
    • 2011-10-30
    相关资源
    最近更新 更多