【问题标题】:php array_multisort use array name as argument [duplicate]php array_multisort 使用数组名作为参数[重复]
【发布时间】:2017-03-31 10:42:32
【问题描述】:

对不起,如果这是重复的,我已经尝试查看以前的帖子,但可能我对 php 的有限理解妨碍了。

这适用于按数组 2 对数组 1 和 3 进行排序:

<?php

$ar[1] = array("game","scissors","rock","paper");
$ar[2] = array("D", "B", "A", "C");
$ar[3] =array("four","two","one","three");

array_multisort($ar[2],$ar[1],$ar[3]);

for ($j=0;$j<=3;$j++) {

    for ($i=1;$i<=3;$i++) {
  echo $ar[$i][$j]." ";
}
echo "\n";
}

?>

输出:

摇滚一个
剪刀 B 两
纸 C 三
游戏 D 四

很好。但我希望用作array_multisort() 参数的数组列表由用户输入指定,因此它不能是文字。相反,我希望程序根据用户输入来决定列表中数组的顺序,然后将结果数组命名为 $supar(超数组)。但是当使用 $supar 作为array_multisort() 的参数时,不会进行排序。

<?php

$ar[1] = array("game","scissors","rock","paper");
$ar[2] = array("D", "B", "A", "C");
$ar[3] =array("four","two","one","three");


$supar = array($ar[2],$ar[1],$ar[3]);
array_multisort($supar);

for ($j=0;$j<=3;$j++) {

    for ($i=1;$i<=3;$i++) {
  echo $ar[$i][$j]." ";
}
echo "\n";
}

?>

输出:

游戏 D 四
剪刀 B 两
摇滚一个
试卷 C 三

我应该如何让array_multisort()按指定的$ar数组对$supar中的数组进行排序?

感谢您的耐心等待。

【问题讨论】:

  • 这是不可能的,这根本不是 array_multisort 的工作方式。如果你真的需要这个,你可以编写你自己的小包装函数,获取你的“超级数组”作为参数,然后调用 multisort 传递三个子数组作为单独的参数。
  • 那很好,但问题是,事先并不清楚哪个数组是列表中的第一个,从而指导其他数组的排序。这将根据用户的输入而有所不同。那么在这种情况下,当我无法在括号内创建文字列表时,如何为 array_multisort 创建一个参数?是否有另一个功能可以解决问题?我的目标是生成一个带有列表的网页,该列表可以按用户选择的不同参数进行排序——这在网页中很常见......
  • 谢谢@axiac。但也许我不知道如何使用这个功能。只需替换 array_multisort($supar);与 call_user_func_array('array_multisort', $supar);给出了相同的结果——没有排序(“游戏 D 四”等)。我错过了什么? ——
  • 哎呀,你是对的。 array_multisort() 通过引用获取其参数。

标签: php arrays array-multisort


【解决方案1】:

如果使用call_user_func_array() 在数组中有参数,则可以调用array_multisort()(或任何其他函数)而不显式指定其参数。

array_multisort() 通过引用获取其参数(以便能够修改它们)。当您构建用作call_user_func_array() 参数的数组并将引用放入此数组时,您必须考虑这一点:

// Input arrays
$ar[1] = array("game", "scissors", "rock", "paper");
$ar[2] = array("D", "B", "A", "C");
$ar[3] = array("four", "two", "one", "three");

// Build the list of arguments for array_multisort()
// Use references to the arrays you want it to sort
$supar = array(&$ar[2], &$ar[1], &$ar[3]);

// Call array_multisort() indirectly
// This is the same as array_multisort($ar[2], $ar[1], $ar[3]);
call_user_func_array('array_multisort', $supar);

查看实际情况:https://3v4l.org/ptiog

【讨论】:

  • 谢谢@axiac!那成功了。现在我可以一块一块地构建我的超级阵列,这意味着它可以在运行时由程序完成:$supar[0]=&amp;$ar[2]; $supar[1]=&amp;$ar[1]; $supar[2]=&amp;$ar[3];,这让我得到了正确的输出。太好了!
【解决方案2】:

您不能仅使用 PHP 函数来做到这一点。 array_multisort() 将不同的数组分别作为参数,你不能只传递一个不同的东西,里面有预期的参数。

你可以做的是编写你自己的函数来为你做这件事。比如:

function my_multisort($supar) {
    array_multisort($supar[2], $supar[1], $supar[3]);
}

$supar = array(
    array("game","scissors","rock","paper"),
    array("D", "B", "A", "C"),
    array("four","two","one","three")
);

my_multisort($supar);

编辑

正如@axiac 正确指出的那样,这基本上是重新发明call_user_func_array() 的一种奇怪的特定方式。您可以根据需要简单地构建参数数组$supar,然后执行

call_user_func_array('array_multisort', $supar);

【讨论】:

  • 恭喜!您刚刚重新发明了 PHP 函数 call_user_func_array()
  • @axiac Lol,你说得对,我可能应该编辑它
  • 请参阅上面对@axiac 的评论。不进行排序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-23
  • 1970-01-01
  • 1970-01-01
  • 2017-12-28
  • 1970-01-01
  • 2012-06-26
  • 1970-01-01
相关资源
最近更新 更多