我有一个在我们的Linux服务器上运行良好的Web应用程序,但是当使用PHP 5.3在Zend Community Edition Server上运行Mac OS时,我们收到错误消息:
usort():数组由用户比较函数修改
每次页面第一次加载时(页面加载和加载大约需要2分钟),在Linux服务器上页面加载1秒钟.
有没有其他人经历过这个或有任何想法如何解决问题,我已经尝试过玩PHP和Apache内存设置没有运气.
我有以下功能.Wordpress功能,但这确实是一个PHP问题.他们$term根据artist_lastname每个对象元数据中的属性对对象进行排序.
我想$meta在第一个函数中传入一个字符串.这将允许我重用此代码,因为我可以将其应用于各种元数据属性.
但我不知道如何将额外的参数传递给usort回调.我试图制作一个JS风格的匿名函数,但服务器上的PHP版本太旧了,引发了语法错误.
任何帮助 - 或者向手册右上角推 - 都非常感激.谢谢!
function sort_by_term_meta($terms, $meta)
{
usort($terms,"term_meta_cmp");
}
function term_meta_cmp( $a, $b )
{
$name_a = get_term_meta($a->term_id, 'artist_lastname', true);
$name_b = get_term_meta($b->term_id, 'artist_lastname', true);
return strcmp($name_a, $name_b);
}
Run Code Online (Sandbox Code Playgroud) 我有一个如下数组:
Array
(
[0] => Array
(
'name' => "Friday"
'weight' => 6
)
[1] => Array
(
'name' => "Monday"
'weight' => 2
)
)
我想获取该数组中的最后一个值('weight'),并使用它来对主数组元素进行排序.所以,在这个数组中,我想对它进行排序,以便'Monday'元素出现在'Friday'元素之前.
array(10) {
[1019]=> array(3) { ["quantity"]=> int(0) ["revenue"]=> int(0) ["seller"]=> string(5) "Lenny" }
[1018]=> array(3) { ["quantity"]=> int(5) ["revenue"]=> int(121) ["seller"]=> string(5) "Lenny" }
[1017]=> array(3) { ["quantity"]=> int(2) ["revenue"]=> int(400) ["seller"]=> string(6) "Anette" }
[1016]=> array(3) { ["quantity"]=> int(25) ["revenue"]=> int(200) ["seller"]=> string(6) "Samuel" }
[1015]=> array(3) { ["quantity"]=> int(1) ["revenue"]=> int(300) ["seller"]=> string(6) "Samuel" }
[1014]=> array(3) { ["quantity"]=> string(2) "41" ["revenue"]=> string(5) "18409" ["seller"]=> string(6) "Samuel" }
}
Run Code Online (Sandbox Code Playgroud)
我正在使用上面的数组.调用这个多维数组$stats.
我想按数量对这个数组进行排序.
因此,multidim阵列具有其第一阵列1016,然后是1018,1017等等.
我这样做是通过:
function compare($x, $y) …Run Code Online (Sandbox Code Playgroud) 我已经看过php文档,在线教程,但没有一个是如何实际工作的.我有一个例子,我在下面玩.
$data = array(
array('msg' => 'some text','month' => 11,'level' => 10),
array('msg' => 'some text','month' => 5,'level' => 10),
array('msg' => 'some text','month' => 8,'level' => 10),
array('msg' => 'some text','month' => 12,'level' => 10),
array('msg' => 'some text','month' => 2,'level' => 10),
array('msg' => 'some text','month' => 3,'level' => 10),
array('msg' => 'some text','month' => 4,'level' => 10),
array('msg' => 'some text','month' => 7,'level' => 10),
array('msg' => 'some text','month' => 10,'level' => 10),
array('msg' => 'some text','month' …Run Code Online (Sandbox Code Playgroud) 当我尝试从这里应用以下代码
usort($myArray, function($a, $b) {
return $a['order'] - $b['order'];
});
Run Code Online (Sandbox Code Playgroud)
它以升序给出了结果.
输出:
0
0
0
0
0
0.29
1.09
6.33
Run Code Online (Sandbox Code Playgroud)
在交换$ a和$ b时,除了一个值之外,它按降序给出结果
usort($myArray, function($a, $b) {
return $b['order'] - $a['order'];
});
Run Code Online (Sandbox Code Playgroud)
输出:
6.33
1.09
0
0
0
0
0.29
0
Run Code Online (Sandbox Code Playgroud)
我想按以下顺序得到结果:
6.33
1.09
0.29
0
0
0
0
0
Run Code Online (Sandbox Code Playgroud)
我如何实现同样的目标.
这是要排序的元素数组的示例:
$items =
array
0 =>
object(stdClass)[8]
public 'id' => string '110' (length=3)
public 'brand_id' => string '18' (length=2)
array
0 => string ' OT-708' (length=7)
public 'failed' => null
public 'diff' => null
1 =>
object(stdClass)[9]
public 'id' => string '161' (length=3)
public 'brand_id' => string '18' (length=2)
Run Code Online (Sandbox Code Playgroud)
所以,让我们说我想排序brand_id.这是我的usort回调函数:
function _compare($itemA, $itemB){
if ($itemA->brand_id == $itemB->brand_id) {
return 0;
}
else{
return strcmp($itemA->brand_id, $itemB->brand_id); //just an example...
}
}
Run Code Online (Sandbox Code Playgroud)
当我什么usort($items, '_compare'); var_dump($items);都没发生的时候.有关如何排除故障的任何线索?
--UPDATE--
好的,我已将问题简化为:
function …Run Code Online (Sandbox Code Playgroud) 这是一个非常深奥的问题,但我真的很好奇.我今天第一次使用usort,而且我对目前的情况特别感兴趣.假设我有以下数组:
$myArray = array(1, 9, 18, 12, 56);
Run Code Online (Sandbox Code Playgroud)
我可以用usort排序:
usort($myArray, function($a, $b){
if ($a == $b) return 0;
return ($a < $b) ? -1 : 1;
});
Run Code Online (Sandbox Code Playgroud)
我不是100%清楚两个参数$ a和$ b的情况.它们是什么,它们代表什么.我的意思是,我可以假设$ a代表数组中的当前项目,但这与之相比究竟是什么?什么是$ b?
我可以增加我的数组以包含字符串:
$myArray = array(
array("Apples", 10),
array("Oranges", 12),
array("Strawberries", 3)
);
Run Code Online (Sandbox Code Playgroud)
并运行以下内容:
usort($myArray, function($a, $b){
return strcmp($a[0], $b[0]);
});
Run Code Online (Sandbox Code Playgroud)
这将根据[0]索引值按字母顺序对我的子数组进行排序.但是这并不能说明$ a和$ b是什么.我只知道匹配我正在寻找的模式.
有人可以提供一些关于实际发生的事情的清晰度吗?
如果uasort在PHP中有一个相当基本的函数,如下所示:
uasort($arr, function($a, $b) {
if ($a > $b)
return -1;
if ($a < $b)
return 1;
...
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试排序的数组如下所示:
{[1642] => 1, [9314] => 4, [1634] => 3 ...}
Run Code Online (Sandbox Code Playgroud)
它包含整数,这是我的主要比较标准.但是,如果整数相等,那么我想在uasort函数内部访问它们的键值,并用它做一些魔术来从中找出排序.
我不知道该怎么做,因为它似乎$a和$b那得到传递给函数的变量仅仅是整数没有相应的密钥,但因为我用函数实际上应该有访问密钥以及方式保留钥匙.有任何想法吗?
我正在使用usort对每个元素中的关联数组进行排序.
当我在数组中排序的所有值都相同时,它仍然会改变数组中元素的位置,有没有办法防止这种情况?
例如:
array(
array('name' => 'Ben', 'authn_weight' => 85.3),
array('name' => 'Josh', 'authn_weight' => 85.3),
array('name' => 'Fred', 'authn_weight' => 85.3)
);
Run Code Online (Sandbox Code Playgroud)
可以改为:
array(
array('name' => 'Josh', 'authn_weight' => 85.3),
array('name' => 'Ben', 'authn_weight' => 85.3),
array('name' => 'Fred', 'authn_weight' => 85.3)
);
Run Code Online (Sandbox Code Playgroud)
这是排序功能:
private function weightSortImplementation($a, $b){
$aWeight = $a['autn_weight'];
$bWeight = $b['autn_weight'];
if ($aWeight == $bWeight) {
return 0;
}
return ($aWeight < $bWeight) ? 1 : -1;
}
Run Code Online (Sandbox Code Playgroud)
我已经检查过该weightSortImplementation函数总是返回0表示它们是相同的.那为什么这仍然重新排序阵列?