2015-07-11 67 views
3

我想根據以下XML按薪水順序排列一個玩家數組。請注意,我已經用薪水對籃球隊進行了排序。PHP:使用XML字符串創建數組

<?php 
$string = <<<EOS 
<Sports_Team> 
<Basketball> 
<Players>Tom, Jack, Sue</Players> 
<salary>4</salary> 
</Basketball> 
<Basketball> 
<Players>Josh, Lee, Carter, Bennett</Players> 
<salary>6</salary> 
</Basketball> 
<Basketball> 
<Players>Mary, Jimmy, Nancy</Players> 
<salary>44</salary> 
</Basketball> 
</Sports_Team> 
EOS; 

$xml = simplexml_load_string($string); 

$trees = $xml->xpath('/Sports_Team/Basketball'); 

function sort_trees($t1, $t2) { 
    return strcmp($t1['salary'], $t2['salary']); 
} 

usort($trees, 'sort_trees'); 
var_dump($trees); 
?> 

我想從$trees製作一系列玩家。如何創建一個數組對象,使得:

[0]-> Mary, Jimmy, Nancy 
[1]-> Josh, Lee, Carter, Bennett 
[2]-> Tom, Jack, Sue 

而且,一旦我存儲我的數組我怎麼把它打印出來有多大嗎?

+1

我修復了一個問題我的第一個例子; '$ users'被用來代替'$ trees'。我也回答了關於按玩家數量排序的部分:) – Will

回答

2

基本上你所做的一切都是完全正確的,只是一對夫婦的小位,我將波紋管解決了:)

  • 在用戶定義的比較函數'sort_trees'中,最好直接比較整數而不是字符串,所以不需要比較s使用(strcmp)。
  • 你也可以使用uasort()方法,而不是usort()以保持索引關係

所以用一個小小的改變,你的代碼可以像下面這樣,最後我用print_r()方法來打印數組作爲你問

<?php 

function sort_trees_by_salary($t1, $t2) 
{ 
    return (int)$t1['salary'] > (int)$t2['salary']; 
} 


function sort_trees_by_number_of_players($t1, $t2) 
{ 
    return substr_count($t1->Players, ',') > substr_count($t2->Players, ','); 
} 


$string = <<<EOS 
<Sports_Team> 
<Basketball> 
<Players>Tom, Jack, Sue</Players> 
<salary>4</salary> 
</Basketball> 
<Basketball> 
<Players>Josh, Lee, Carter, Bennett</Players> 
<salary>6</salary> 
</Basketball> 
<Basketball> 
<Players>Mary, Jimmy, Nancy</Players> 
<salary>44</salary> 
</Basketball> 
</Sports_Team> 
EOS; 

$xml = simplexml_load_string($string); 

$trees = $xml->xpath('/Sports_Team/Basketball'); 

// Lets say you want to sort by salary 
uasort($trees, 'sort_trees_by_salary'); 
$results = []; 
foreach ($trees as $tree) { 
    $results[] = (string)$tree->Players; 
} 

echo 'Sorted by Salary:'; 
print_r($results); 


// Lets say you want to sort by number of players 
uasort($trees, 'sort_trees_by_number_of_players'); 
$results = []; 
foreach ($trees as $tree) { 
    $results[] = (string)$tree->Players; 
} 

echo 'Sorted by number of players:'; 
print_r($results); 

輸出:

Sorted by Salary:Array 
(
    [0] => Mary, Jimmy, Nancy 
    [1] => Josh, Lee, Carter, Bennett 
    [2] => Tom, Jack, Sue 
) 
Sorted by number of players:Array 
(
    [0] => Mary, Jimmy, Nancy 
    [1] => Tom, Jack, Sue 
    [2] => Josh, Lee, Carter, Bennett 
) 

請注意:考慮0123'作品與參考上面的例子將適用於您的數據的兩個排序方法,首先根據工資排序列表和第二個基於數量的球員

+0

我如何根據玩家數量創建一個排序數組? – cooldood3490

+0

@ cooldood3490,我已經提供了一個解決方案,根據玩家人數根據每行中找到的逗號(,)數排序列表。然而最好的方法是在你的xml數據集中包含玩家的數量。但只有在訪問數據源/提供程序的情況下才有可能。 – Ali

+1

謝謝阿里。多餘字符 – cooldood3490

0

假設你有PHP 5.3+,試試這個:

$playersArray = array_map(
    create_function('$inputArray', 'return (string) $inputArray->Players;'), 
    $trees 
); 

例如:

php > var_dump($playersArray); 
array(3) { 
    [0]=> 
    string(18) "Mary, Jimmy, Nancy" 
    [1]=> 
    string(26) "Josh, Lee, Carter, Bennett" 
    [2]=> 
    string(14) "Tom, Jack, Sue" 
} 

如果您正在使用舊的PHP,你需要使用一個真正的(非匿名)功能array_map(),或使用create_function()

$playersArray = array_map(
    create_function('$inputArray', 'return (array) $inputArray->Players;'), 
    $users 
); 

回答最後一個部分,你怎麼打印它在視覺上,好,這取決於!如果您只是爲了調試目的而轉儲它以查看它,請使用var_dump()print_r()。兩者都將數組變量作爲唯一需要的參數。 var_dump()有點冗長。

這是var_dump()manual):

php > var_dump($playersArray); 
array(3) { 
    [0]=> 
    string(18) "Mary, Jimmy, Nancy" 
    [1]=> 
    string(26) "Josh, Lee, Carter, Bennett" 
    [2]=> 
    string(14) "Tom, Jack, Sue" 
} 

這是print_r()manual):

php > print_r($playersArray); 
Array 
(
    [0] => Mary, Jimmy, Nancy 
    [1] => Josh, Lee, Carter, Bennett 
    [2] => Tom, Jack, Sue 
) 

否則,處理和基於陣列上顯示輸出爲最終用戶,你會可能想循環並處理它,或者使用類似於上面的array_map()來生成輸出。另外,如果您想在PHP Console中對此進行類似於我在示例中所做的操作,則可以運行php -a並在提示符處鍵入您的代碼。

編輯

要回答的意見的問題,試試這個:

/* Sort by the number of ',' characters in the string. */ 
function sort_players($a, $b) { 
    $ca = substr_count($a, ','); 
    $cb = substr_count($b, ','); 
    if ($ca == $cb) return 0; 
    return ($ca > $cb) ? -1 : 1; 
} 

usort($playersArray, 'sort_players'); 
+0

請不要使用沒有靜態緩存的'create_function'。這爲每個調用創建全局函數,這些都是**從不處理**。 – mpyw

+0

簡單的包裝:'function create_func($ arg,$ code){static $ c; if(!isset($ c [$ arg] [$ code]))$ c [$ arg] [$ code] = create_function($ arg,$ code);返回$ c [$ arg] [$ code]; }' – mpyw