php - создать ассоциативный массив while loop - PullRequest
1 голос
/ 29 февраля 2012

Я пытаюсь создать 2 новых массива из одного существующего массива ($ array), используя следующий цикл «foreach».Однако я не уверен, что это правильно:

        $emails = array();
        $numbers = array();
        while($array){
            $entry = $array['entry1'];
            $number = number($entry);
            if(isset($number) && (strlen($number) > 9)){
                $numbers[] = array('entry1' => $entry, 'number' => $number);
            }
            else{
                $email = email($entry);
                $emails[] = array('entry1' => $entry, 'email' => $email);
            }
        }

должны ли внутренние массивы иметь []?мне даже нужно запускать массивы вне цикла while?или пропустить это?лучше использовать цикл foreach?

Обновление:

Хорошо, вот исходный массив: он извлекается из запроса MySQL из наборов из двух чисел:

{('uid1','uid2'),('uid1','uid5'),('uid9','uid93'),....) В каждой строке могут быть другие данные, но это только две точки данных, которые действительно имеют значение.

Я пытаюсь сделать это для конкретного пользователя ($ entry), создать две отдельныемассивы: всех пользователей, у которых есть номера (у нас есть такая функция), и всех остальных - их электронных писем.Таким образом, результатом будут 2 новых массива, которые будут выглядеть следующим образом: для конкретного uid79887:

numbers array: {('uid8','xxx-xxxx-xxx'),('uid34','yyy-yyyy-yyy'),('uid654','vvv-vvvv-vvv')}

emails array: {('uid4','mmm@mmm.com'),('uid1','lll@lll.com'),('uid55554','ppp@ppp.com')}

Ответы [ 3 ]

3 голосов
/ 29 февраля 2012

Сначала несколько вещей:

  • Хорошей практикой является инициализация ваших переменных, просто сделайте это (у нее много положительных моментов).
  • Что за тест while($array)? Вы должны использовать foreach( $array as $entry) или while( count( $array)), если вы удаляете элементы из массива.
  • Почему вы тестируете isset( $number), когда он всегда установлен? Это инициализированная переменная. Вы, вероятно, проверяете null, поэтому используйте !is_null() или ($number !== null). Даже если это работает, это вводит в заблуждение.

Я думаю ваш код должен выглядеть следующим образом:

$emails = array();
$numbers = array();
foreach( $array as $entry){
    $entry = isset( $entry['entry1']) ? $entry['entry1'] : null;
    $number = number( $entry);
    if( strlen($number) > 9 ){ // If $number is empty it will have strlen < 1 .)
       $numbers[] = array('entry1' => $entry, 'number' => $number);
    } else {
       $emails[] = array('entry1' => $entry, 'email' => email( $entry));
    }
}
1 голос
/ 29 февраля 2012

Я думаю, это то, что вы пытаетесь достичь:

$emails = $numbers = Array();
foreach($array as $item) {
  $e = $item['entry1'];
  $number = number($e);
  if(strlen($number) > 9) {
    $numbers[] = Array('entry1' => $e, 'number' => $number);
  }
  else {
    $email = email($entry);
    $emails[] = Array('entry1' => $e, 'email' => $email);
  }
}

в вашем коде, пока ($ array) не зацикливается на массиве, он зацикливается, пока $ array == false так как $ array не изменяется в вашем цикле, он никогда не войдет или в цикл, или никогда не завершится как правило, использование цикла foreach создает код, более легкий для понимания

0 голосов
/ 29 февраля 2012

Предполагая, что это не какое-то домашнее задание, почему бы вам не сделать это следующим образом:

$emails = array();
$numbers = array();

foreach( $array as $entry )
{
    $number = number($entry);
    if( $number && strlen($number) > 9 )
    {
        array_push($numbers, array('entry1' => $entry, 'number' => $number));
    }
    else
    {
        array_push($emails, array('entry1' => $entry, 'email' => email($entry)));
    }
}

Лучше использовать встроенные функции, которые пытаются выполнить свою собственную.Функция foreach() работает очень хорошо.

...