2015-04-23 117 views
0

我想用字符串動態創建一個數組。下面是我嘗試使用代碼:動態創建和訪問陣列

$users = get_users($args_users); 
$user_display = array(); 
$user_display_sorted = array(); 
foreach($users as $user){ 
    echo $user->ID; 
    $first_name = get_user_meta($user->ID, 'first_name', true); 
    $last_name = get_user_meta($user->ID, 'last_name', true); 
    $name = $first_name.' '.$last_name; 
    array_push($user_display, $user->ID); 
    array_push($user_display, $name); 
    $user_display_sorted = asort($user_display); 
} 
print_r($user_display); 

當我打印陣列我得到如下:
Array ([0] => 5 [1] => Test Person[2] => 6 [3] => Adam Person)

我想輸出是這樣的:
Array ([0] [ID] => 5 [name] => Test Person; [1] [ID] => 6 [name] => Adam Person)

所以我喜歡做的user_display_sorted陣列上的foreach循環和訪問的變量是這樣的:

foreach($user_display_sorted as $user_display_sort){ 
    echo $user_display_sort->ID; 
} 

我該怎麼做?

+0

使用id作爲數組鍵,它通常很有幫助 – 2015-04-23 00:44:13

+0

不需要數組推動 – 2015-04-23 00:44:55

+0

@Dagon我不喜歡'array_push()'因爲你不能定義一個鍵,不明白爲什麼人們正在使用它。 (未來在新西蘭做什麼?天氣會不錯:)) – Rizier123

回答

6

你只需要推一組數據要單獨附加,而不是值:

foreach($users as $user){ 
    echo $user->ID; 
    $first_name = get_user_meta($user->ID, 'first_name', true); 
    $last_name = get_user_meta($user->ID, 'last_name', true); 
    $name = $first_name.' '.$last_name; 
    array_push($user_display, array('ID' => $user->ID, 'name' => $name)); 
    $user_display_sorted = asort($user_display); 
} 

從您的評論繼詢問如何排序 - 因爲這是一個多維數組,你可以排序它採用array_multisort()like this

array_multisort($example, SORT_ASC, SORT_NATURAL, array_map(
    function($row) { 
     return $row['name']; 
    }, 
    $example 
)); 

然而,隨着袞在多個地方曾建議,如果你的目標是通過再使用ID值排序爲數組鍵將整體更容易,即從S蛋撻至底:

foreach ($users as $user) { 
    // ... 
    $user_display[$user->ID] = $name; 
} 

// sort, maintaining keys 
asort($user_display); 

// output again if you want to 
foreach ($user_display as $id => $name) { 
    echo 'User ID ' . $id . ' has name ' . $name, PHP_EOL; 
} 

Demo here

對於排序參考,the PHP manual has a great table解釋哪個函數適合。

+1

但爲什麼要推動?爲什麼不使用用戶密鑰作爲查找簡單的數組鍵呢?爲什麼我不應該拉女孩馬尾巴? – 2015-04-23 00:50:13

+0

我在'array_push()'你的身邊 - 我討厭它。但是提供這樣的答案可以讓OP看到他開始的和他想要結束的數據結構的不同,而不需要將'array_push()'改爲簡單的$ user_display [] ... ' –

+0

@scrowler可能是一個不同的問題,但這將如何按名稱按升序排序? – user1048676

1

對於你想擁有的輸出,請嘗試以下操作:

$user_display[] = array('ID' => $user->ID, 'name' => $name); 

,而不是兩個array_push線。至於排序顯示,您可能需要使用usort並傳遞可比較名稱(或ID,取決於您想要執行的操作)的可調用函數。

+0

或jsut'$ user_display [$ user-> ID] = $ name;' – 2015-04-23 00:46:11

+0

是的,這也是我也會這樣做的,但是OP特意詢問他想要的輸出。 –

+2

OP的經常不知道對他們有什麼好處 – 2015-04-23 00:49:18

0

你快到了。

$userVar = new stdClass(); 
$userVar->ID = $user->ID; 
$userVar->name = $name; 
array_push($user_dispaly, $userVar); 

如果用上述方法替換double數組,可以按照需要訪問項目。我所做的只是創建一個對象,以便您可以使用箭頭訪問數據,然後將該對象添加到數組中。

+0

從邏輯的角度來看,這最有意義,因爲元素比一個數組更具代表性。 – Ohgodwhy

+1

@Ohgodwhy呃,我不是stdClass對象的粉絲。它們不能做一個數組不能做的事情,也不能做一個數組可以做的事情。如果你想使用一個對象,定義一個類;如果你想要一個特別的散列,一個數組工作正常。 – IMSoP