У меня есть этот цикл foreach, и мне было интересно, есть ли способ отсортировать массив по значению, если он не пустой, чтобы быть наверху, а остальное идет вниз. вот что я сделал до сих пор:

foreach ((array)$accounts as $v=>$k){
        if(!empty($k)) {
                echo $v;
                echo "</br>";
                echo $k;
                echo "</br>";
        } else {
            echo $v;
            echo "</br>";
        }
    }

Примечание: $k возвращает либо строку, либо она просто пуста, а не NULL

Результат выглядит примерно так:

k1
v1
k2
k3
v3

Как видите, k2 не имеет значения. я хочу, чтобы он был внизу, так как он не имеет значения.

Вывод массива напрямую с помощью print_r($accounts, TRUE):

Array
(
    [TwitterSecKey] => Twitter Sec Key
    [GoogleSecKey] => 
    [InstagramSecKey] => Instagram Sec Key
    [FacebookSecKey] => 
)

Как видите, у Google и Facebook нет ценностей. поэтому я хочу, чтобы они были внизу.

php
0
Alamri 26 Фев 2016 в 19:12

3 ответа

Лучший ответ

Спасибо, что наконец предоставили структуру массива.

На основании ваших требований:

отсортируйте массив по значению, если он не пустой, чтобы быть наверху, а остальное - вниз

Нет необходимости в сложных алгоритмах сортировки с uasort(), попробуйте следующее:

<?php

$accounts= array(
    'TwitterSecKey'=>'Twitter Sec Key',
    'GoogleSecKey'=>null,
    'InstagramSecKey'=>'Instagram Sec Key',
    'FacebookSecKey'=>null
);

echo '<pre>'.print_r($accounts, TRUE).'</pre>';

arsort($accounts); // secret sauce

echo '<pre>'.print_r($accounts, TRUE).'</pre>';

http://php.net/manual/en/array.sorting.php

1
MonkeyZeus 26 Фев 2016 в 17:22

Вы можете использовать пользовательскую функцию с uasort, которая помещает пустые значения последний, но все остальные сортируют по алфавиту:

$accounts = array (
  'x' => 'c',
  'y' => 'a',
  'z' => 'b',
  'n' => '',
);

uasort($accounts, function($a, $b) {
    return empty($a) ? 1 : (empty($b) ? -1 : strcmp($a,$b));
});

var_export($accounts);

Выход:

array (
  'y' => 'a',
  'z' => 'b',
  'x' => 'c',
  'n' => '',
)
1
trincot 26 Фев 2016 в 18:18

Вы можете сделать это, чтобы отсортировать массив с помощью usort, а затем использовать их соответственно

$accounts = (array) $accounts;
usort($accounts, function($a, $b) {
    return strlen($b) - strlen($a);
});

Сейчас же.

 foreach($accounts as $k=>$v){
       echo 'key: '. $k .'<br>';
       echo 'value: '. $v .'<br>';
     }

ОБНОВЛЕНИЕ Чтобы сохранить ключи, вы можете использовать uasort как

$accounts = (array) $accounts;
    uasort($accounts, function($a, $b) {
        return strlen($b) - strlen($a);
    });
1
Nabin Kunwar 26 Фев 2016 в 17:28