2016-02-17 3 views
0

Мне нужен ассоциативный массив с этой структурой (ключи - это строки, значения - индексированные массивы), и я добавляю элементы динамически.PHP Ассоциативный массив, вставляемый как индексированный массив

Array(
["itemCategory"]=> Array("itemName", "itemName"...) 
["itemCategory"]=> Array("itemName", "itemName"...) 
... 
) 

Однако, я не могу показаться, чтобы сформировать массив в пределах ассоциативного массива, когда я делаю это (в соответствии с просьбой, я добавил код MySQLi):

if (!($stmt = $mysqli->prepare(
"SELECT b.id, b.type, b.name, b.street, b.city, b.state, b.zipcode, b.phone, b.website, b.hours, b.latitude, b.longitude, c.id, c.name, i.id, i.name 
FROM business b LEFT JOIN business_category_item bci ON bci.bid = b.id 
LEFT JOIN category c ON c.id=bci.cid LEFT JOIN item i ON i.id = bci.iid"))) { 
    echo "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error; 
} 

if (!$stmt->execute()) { 
    echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error; 
} 

if(!$stmt->bind_result($bID,$bT,$bN,$bStr,$bC,$bSta,$bZ,$bP,$bW,$bH,$bLat,$bLng,$cI,$cN,$iI,$iN)){ 
    echo "Bind failed: " . $mysqli->connect_errno . " " . $mysqlii->connect_error; 
} 

$arr=array(); 
while($row=$stmt->fetch()){ 
    $arr[$cN][]=$iN; //gettype($cN) returns "string" 
} 

Я также попытался array_push () без везения (Неизвестная ошибка индекса):

array_push($arr[$cN],$iN); 

Когда я печатаю мой массив, он всегда печатает так:

print_r($arr, true); 

Array 
(
    [0] => Array 
     (
      [0] => "MP3 player" 
      [1] => "Computers" 
     ) 

    [1] => Array 
     (
      [0] => "Tank tops" 
      [1] => "Blankets" 
      [2] => "Shirts" 
     ) 
) 

вместо того, что мне нужно, что:

Array 
(
    ["electronics"] => Array 
     (
      [0] => "MP3 player" 
      [1] => "Computers" 
     ) 

    ["clothing"] => Array 
     (
      [0] => "Tank tops" 
      [1] => "Blankets" 
      [2] => "Shirts" 
     ) 
) 

Любая помощь будет оценена.

+2

То, что вы написали, выглядит так, как должно работать. Вы уверены, что '$ cName' установлен правильно? – Barmar

+0

Вы используете 'mysqli'? показать '-> bind_result()' часть, где, скорее всего, '$ cName' установлено – Ghost

+0

Пожалуйста, разместите фактический код, особенно часть, которая устанавливает' $ cName'. – Barmar

ответ

0

Я считаю, что я решил это. Когда я использую var_dump($arr);, он корректно печатает как ассоциативный массив. Когда я использовал print_r($arr);, он печатает как индексированный массив. Я не знаю, почему это так.

EDIT: На самом деле проблема заключалась в том, что я отсортировал массив с помощью сортировки ($ arr) перед его печатью.

+0

Я никогда не видел ничего подобного. – Barmar

+0

Вы посмотрели мою демонстрацию на ideone.com? Он использует 'print_r', и он корректно печатает как ассоциативный массив. – Barmar

+0

Это произойдет, если вы сделали что-то вроде 'print_r (array_values ​​($ arr))'. Но я не считаю, что просто переключение с 'print_r()' на 'var_dump()', не изменяя ничего другого, решит его. – Barmar

0

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

$result = $mysqli->query("SELECT..."); 
if ($result->num_rows) { 
    while($row = $result->fetch_assoc()){ 
     $arr[$row['id']][] = $row['name']; 
    } 
} 

Вы заблудитесь очень легко во всех этих многочисленных переменных с непонятными названиями, которые вы делаете в bind_result().

+0

Я ценю советы по стилю. Однако я решил проблему. Смотри ниже. – Vinnie

+0

Не беспокойтесь. Просто пытаюсь сэкономить вам некоторую потенциальную головную боль в долгосрочной перспективе. –

+0

Он использует 'mysqli', а не' PDO'. – Barmar

Смежные вопросы