PHP массивы. Как отформатировать для моего результата - PullRequest
0 голосов
/ 02 апреля 2009

Я довольно новичок в php и могу использовать некоторую помощь, чтобы понять, как получить мой результат так, как он мне нужен из запроса к базе данных.

Мне нужен ассоциативный массив, подобный этому, 'bla' => 'bla'. Что я получаю из цикла foreach, так это из печати:

[0] => Array
    (
        [0] => test0
        [name] => test0
        [1] => 1
        [customer_id] => 1
    )

[1] => Array
    (
        [0] => test
        [name] => test
        [1] => 2
        [customer_id] => 2
    )

Вот мой цикл:

foreach($res as $key=>$val)
{
  // have no idea..
}

Может кто-нибудь помочь мне отформатировать мои результаты так, чтобы они выглядели как 'index' => 'value'

Спасибо за любую помощь.


Вот пример кода, который использует foreach, но все же вызывает ассоциацию. Я не понимаю Я думаю, что мой набор результатов с индексами, потому что я не пишу цикл правильно. Вот код, который использует foreach

foreach ($items as $key=>$value) {
    if (strpos(strtolower($key), $q) !== false) {
        echo "$key|$value\n";
    }
}

Вот часть класса базы данных, которую я использую для получения результатов.

$returnArray = array();
$i=0;
while ($row = mysql_fetch_array($result, MYSQL_BOTH)) {
    if($row)
        $returnArray[$i++] = $row;
}
mysql_free_result($result);
return $returnArray;

После использования кода, который мне дали, чтобы опустить номера индексов, вот что у меня сейчас осталось. Это близко, но не то, что мне нужно.

Массив ( [id] => 1 [cust] => Бобс авто )

Вот как должна читаться строка выше

'1' => 'bobs auto'

То, что я пытаюсь сделать, - это отформатировать вывод для вызова JSON для поля предложения.



Я не могу заставить это работать. Здесь все после моего подключения к БД.

<code>$out_array = array();
foreach($items as $key=>$val)
{
    if(is_int($key))
    {
      continue;
    }
    $out[$key['id']] = $val['cust'];
}



//echo'<pre>';
//print_r($out_array);
//echo'
'; foreach ($ out_array как $ key => $ value) { if (strpos (strtolower ($ key), $ q)! == false) { echo "$ key | $ value \ n"; } }

Хорошо, я думаю, что спускаюсь домой. У меня есть то, что мне нужно. Это код, который у меня есть.

$out_array = array();
foreach($items as $key)
{
    $out_array[$key] = $val;
//$out_array[$key['id']] = $key['cust'];
}

Обратите внимание, что закомментированная строка не работает, она выводит как id дважды, но не закомментированная строка работает просто отлично. Вот вывод из этого.

Array
(
    [8] => 
    [FAT BURGER] => 
)

С этого момента я бы просто использовал другой foreach для перебора всего набора данных? Вывод массива, который вы видите выше, взят из print_r.


Это то, что у меня сейчас есть и возвращает правильную связь, однако я должен закомментировать условие strpos, чтобы получить какие-либо результаты, и я не знаю почему. Правильно ли я вложил эти циклы foreach, как у меня?

$out_array = array();
foreach($items as $key)
{
  //    $out_array[$key] = $val;
  $out_array[$key['id']] = $key['cust'];

  foreach ($out_array as $key=>$value)
  {
      if (strpos(strtolower($key), $q) !== false)
      {
          echo "$key|$value\n";
      }
  }

}

Ответы [ 6 ]

3 голосов
/ 02 апреля 2009

То есть вам не нужны числовые индексы в вашем массиве? Вы должны использовать mysql_fetch_array () , которая возвращает ваши результаты как с числовыми, так и с строковыми ключами. Используйте mysql_fetch_assoc () , чтобы получить массив только со строковыми ключами (строка является именем столбца).

1 голос
/ 02 апреля 2009

Попробуйте что-нибудь подобное. Он работает, пропуская целочисленные индексы и помещая нецелые индексы в выходной массив.

$out_array = array();
foreach($res as $key=>$val) {
    if(is_int($key)) {continue;}
    $out_array[$key] = $val;
}

EDIT:

<code>$out_array = array();
foreach($items as $key=>$val)
{
    if(is_int($key))
    {
      continue;
    }
}
$out[$out_array['id']] = $out_array['cust'];


//echo'<pre>';
//print_r($out_array);
//echo'
'; foreach ($ out как $ key => $ value) { if (strpos (strtolower ($ key), $ q)! == false) { echo "$ key | $ value \ n"; } }
1 голос
/ 02 апреля 2009

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

При запуске запроса:

$query = "SELECT * FROM Table WHERE ...";
$query = mysql_query($query);

while($info = mysql_fetch_assoc($query)){

    //$info is now a single row, associative array
    echo print_r($info);
}

echo print_r отображает результаты так, как вы их ищете сейчас 'index' => 'value'

РЕДАКТИРОВАТЬ: на основе комментариев.

Если вы абсолютно НЕ МОЖЕТЕ избавиться от mysql_fetch_array, тогда вам придется взломать код. Это не чисто, и я настоятельно рекомендую рефакторинг, но ниже приведен код, который вам понадобится для создания массива индексов имен полей только из того, что вы дали

$my_array = array();
$info = $data[0]; //grab the first row of your data set from the original question.
    foreach($info as $index => $value){
        if(!is_int($index)){
            $my_array[$index] = $value;
        }
    }

Вновь созданный $ my_array будет в том формате, который вы ищете.

0 голосов
/ 02 апреля 2009

Хорошо, относительно моего последнего вопроса. Я ошибся во вложении циклов foreach. У меня также была опечатка в моем коде. Это работает, наконец. Спасибо всем, кто мне помог!

0 голосов
/ 02 апреля 2009
$ret = array();

foreach($rows as $row)
{
    $ret[$row['id']] = $row['cust'];
}

$json = json_encode($ret);

echo $json;
// Prints something like:
//
// {1:'bob'}

Обратите внимание на использование json_encode.

0 голосов
/ 02 апреля 2009

Вы получили этот массив из функции запроса и результата из PHP, да?

Если вы использовали mysql, на самом деле это проще сделать, как показано ниже.

$query = mysql_query("SELECT * FROM dbname"); //Create the query to your database
while($data = mysql_fetch_array($query)) //Loop through our results from the query
{
    echo($data['fieldname']."<br/>"); //echo out data through the loop
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...